首页 > 解决方案 > Oracle 文本包含对具有单字符的索引的搜索不起作用

问题描述

我有一个名为 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)的完整搜索字符串时,搜索不会返回该行?

提前感谢您的帮助。邓克斯

标签: oracletext

解决方案


这是因为它'A'默认 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;

更多细节。您可以在创建上下文索引时设置自定义(默认为空)停止列表:

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

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

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

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


推荐阅读