Oracle文本包含对索引的搜索,但单个字符不起作用

时间:2019-04-09 13:57:47

标签: oracle text

我有一个名为index_search的简单表,创建为:

BEGIN
 ctx_ddl.create_preference('my_pref', 'BASIC_WORDLIST');
 ctx_ddl.set_attribute('my_pref', 'SUBSTRING_INDEX', 'YES');
 ctx_ddl.set_attribute('my_pref', 'wildcard_maxterms', 0);
END;
/

CREATE TABLE my_index_search (search_tokens VARCHAR2(100));

CREATE INDEX my_index_search_ctx_idx01 ON
  my_index_search (
    search_tokens
  )
    INDEXTYPE IS ctxsys.context PARAMETERS ( 'Wordlist my_pref SYNC(ON COMMIT)' );

INSERT INTO my_index_search 
VALUES('A ABC/45/464587');

COMMIT;

我的文本查询使用contains运算符,当我搜索字符串' ABC / 45/464587 '时,返回该行:

 SELECT *
   FROM my_index_search i
  WHERE contains ( search_tokens, '%ABC/45/464587%', 1 ) > 0;

但是当我搜索字符串' A ABC / 45/464587 '时,该行不是:

 SELECT *
   FROM my_index_search i
  WHERE contains ( search_tokens, '%A ABC/45/464587%', 1 ) > 0;

为什么当我添加包含单个字符(在这种情况下为'A'int)的完整搜索字符串时,搜索是否不返回行?

在此先感谢您的帮助。 邓奇斯

1 个答案:

答案 0 :(得分:0)

这是因为'A'the default stoplist的一部分,因此Oracle Text不对其进行索引。您无法在非索引字表中搜索单词。如果您尝试输入其他字母,则可以。

INSERT INTO my_index_search 
VALUES('B ABC/45/464587');
COMMIT;

SELECT *
   FROM my_index_search i
  WHERE contains ( search_tokens, '%B ABC/45/464587%', 1 ) > 0;

More details。创建上下文索引时,您可以设置一个自定义(默认为空)停止列表:

begin
ctx_ddl.create_stoplist('mystop', 'BASIC_STOPLIST');
ctx_ddl.add_stopword('mystop', 'The');
end;

并添加到您的创建索引首选项中:

PARAMETERS ( 'Wordlist my_pref SYNC(ON COMMIT) Stoplist mystop' );

您还可以替换现有索引中的非索引字表,但必须重新构建它。