使用通配符查询,不匹配数据与 Oracle Text 索引
Query with wildcard and dot not matching data with Oracle Text index
在文本搜索中结合使用通配符和点时,我的查询找不到匹配的行。
例如:
CREATE TABLE MY_TABLE( ITEM_NUMBER VARCHAR2(50 BYTE) NOT NULL);
INSERT INTO MY_TABLE (ITEM_NUMBER) VALUES ('1234.1234');
create index TIX_ITEMNO on MY_TABLE(ITEM_NUMBER) indextype is ctxsys.context;
我想在 MY_TABLE 中找到行,其中 ITEM_NUMBER 列是“1234.1234”
这确实找到了行:
SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%1234') > 0
这没有找到行:
SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0
我不明白为什么,因为根据 Oracle,点不是必须转义的特殊字符。
我该如何处理这种情况?
我想你想要
SELECT * FROM MY_TABLE
WHERE ITEM_NUMBER like '%.1234'
这是因为您的默认词法分析器将句点视为单词分隔符。
初始设置:
create table my_table(item_number varchar2(50 byte) not null);
insert into my_table values ('1234.1234');
create index my_index on my_table (item_number)
indextype is ctxsys.context;
这会得到您看到的行为:
SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%1234') > 0;
--------------------------------------------------
1234.1234
SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0;
no rows selected
如果添加定义 PRINTJOINS
的词法分析器以包含句点:
drop index my_index;
begin
ctx_ddl.create_preference('my_lexer', 'BASIC_LEXER');
ctx_ddl.set_attribute('my_lexer', 'PRINTJOINS', '.');
end;
/
create index my_index on my_table (item_number)
indextype is ctxsys.context
parameters ('lexer my_lexer');
然后它会按照您想要的方式运行:
SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0;
ITEM_NUMBER
--------------------------------------------------
1234.1234
在文本搜索中结合使用通配符和点时,我的查询找不到匹配的行。
例如:
CREATE TABLE MY_TABLE( ITEM_NUMBER VARCHAR2(50 BYTE) NOT NULL);
INSERT INTO MY_TABLE (ITEM_NUMBER) VALUES ('1234.1234');
create index TIX_ITEMNO on MY_TABLE(ITEM_NUMBER) indextype is ctxsys.context;
我想在 MY_TABLE 中找到行,其中 ITEM_NUMBER 列是“1234.1234”
这确实找到了行:
SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%1234') > 0
这没有找到行:
SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0
我不明白为什么,因为根据 Oracle,点不是必须转义的特殊字符。
我该如何处理这种情况?
我想你想要
SELECT * FROM MY_TABLE
WHERE ITEM_NUMBER like '%.1234'
这是因为您的默认词法分析器将句点视为单词分隔符。
初始设置:
create table my_table(item_number varchar2(50 byte) not null);
insert into my_table values ('1234.1234');
create index my_index on my_table (item_number)
indextype is ctxsys.context;
这会得到您看到的行为:
SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%1234') > 0;
--------------------------------------------------
1234.1234
SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0;
no rows selected
如果添加定义 PRINTJOINS
的词法分析器以包含句点:
drop index my_index;
begin
ctx_ddl.create_preference('my_lexer', 'BASIC_LEXER');
ctx_ddl.set_attribute('my_lexer', 'PRINTJOINS', '.');
end;
/
create index my_index on my_table (item_number)
indextype is ctxsys.context
parameters ('lexer my_lexer');
然后它会按照您想要的方式运行:
SELECT * FROM MY_TABLE
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0;
ITEM_NUMBER
--------------------------------------------------
1234.1234