oracle - 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)的完整搜索字符串时,搜索不会返回该行?
提前感谢您的帮助。邓克斯
解决方案
这是因为它'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' );
您还可以替换现有索引中的停止列表,但您必须重新构建它。
推荐阅读
- xml - 使用 .rss 文件在报告 XML 中添加新的子节点
- php - Laravel 为现有 PDF 文件添加密码保护
- ios - RxSwift 替换 shouldChangeCharactersInRange
- javascript - 无法从另一个 js 文件引用一个 js 文件中的 js 数组
- php - php PDO 查询,带有几个要绑定的参数
- django - 异常类型:发送 POST 请求时出现 MultiValueDictKeyError
- python - OpenCV Python 流式传输 m3u8 滞后
- javascript - 与用户输入匹配时无法设置输入值?
- java - 在我的程序运行时无法更改 timer.scheduleAtFixedRate(TimerTask task, long delay, long period) 的长时间
- java - 提高我的方法的性能