回答

收藏

Oracle Contains不能正常工作

技术问答 技术问答 198 人阅读 | 0 人回复 | 2023-09-14

表中有一列是上下文索引。
6 ]- V/ k: `7 V3 P( ^CREATE INDEX CIDX_MUSTFIXBY ON TABLE  (MUST_FIX_BY)INDEXTYPE IS CTXSYS.CONTEXTNOPARALLEL;我正在尝试查询条件5 N9 ]- T, [; o4 V  o1 n
AND must_fix_by像“ Q2%”9 t, u! \3 x! [' q* m) K5 {; E
它返回行。
* B+ J6 i5 l! a$ V# ^" N" e1 `但是当我试着用的时候where条件查询时
# F1 H  p$ W6 A. {; yAND包含(must_fix_by,’Q2’)> 0
6 `8 _/ P( C3 H  f  B
而且它不回任何行。9 H& a5 P  E" g4 m
有人能告诉我为什么喜欢工作,包括不工作吗?# O9 q3 B- b, X( V7 B7 ]
                                                               
% [: O! e  Z8 t9 Y6 P    解决方案:                                                               
6 i! B( s" D1 D/ p* j( L6 N                                                                两个可能的原因-索引可能不同步,CONTAINS似乎在LIKE匹配字符串时匹配单词。
' y/ C& L+ c' I两个字符串的示例,其中LIKE两者都CONTAINS都不匹配:
5 \7 D0 o$ `' V1 n% z  S) ncreate table test1(must_fix_by varchar2(4000));create index cidx_mustfixby on test1(must_fix_by) indextype is ctxsys.context;insert into test1 values('Q234567');insert into test1 values('Q2 234567');select * from test1 where must_fix_by like 'Q2%';MUST_FIX_BY-----------Q234567Q2 234567select * from test1 where contains(must_fix_by,'Q2') > 0;no rows selected默认情况下,CONTEXT索引需要手动同步。您要么需要操作:execctx_ddl.sync_index('cidx_mustfixby;on commit。
5 o8 P0 Y6 ~) Z' @1 yexec ctx_ddl.sync_index('cidx_mustfixby');select * from test1 where contains(must_fix_by,'Q2') > 0;MUST_FIX_BY-----------Q2 234567这解决了其中一个问题。Q234567还是不匹配。Oracle. _7 i* C6 i: K! O. h5 m* y2 m' D) `
Text我不太了解它,甚至找不到它CONTAINS简单描述工作原理。但这似乎是基于完整的单词而不是字符串。Q2和其他字符之间需要有一定类型的单词边界,以便简单地使用CONTAINS过滤器捡起来。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则