我有一个名为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)的完整搜索字符串时,搜索是否不返回行?
在此先感谢您的帮助。 邓奇斯
答案 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' );
您还可以替换现有索引中的非索引字表,但必须重新构建它。