【问题标题】:Query with wildcard and dot not matching data with Oracle Text index使用通配符和点查询与 Oracle Text 索引不匹配的数据
【发布时间】:2016-06-17 15:31:58
【问题描述】:

在文本搜索中结合使用通配符和点时,我的查询找不到匹配的行。

例如:

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,点不是必须转义的特殊字符。

我该如何处理这种情况?

【问题讨论】:

  • 第一个匹配而不是第二个匹配的数据是什么?
  • 请显示运行查询的示例输入数据以及预期结果。
  • 您没有以'.1234' 结尾的text 值。
  • 你确定这是一个文本列吗?
  • ITEM_NUMBER VARCHAR2(50 BYTE) NOT NULL,

标签: sql oracle oracle-text


【解决方案1】:

这是因为您的默认词法分析器将句点视为单词分隔符。

初始设置:

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

Read more about text indexing elements.

【讨论】:

  • 超级解说。 :)
【解决方案2】:

我想你想要

SELECT * FROM MY_TABLE
WHERE ITEM_NUMBER like '%.1234'

【讨论】:

  • 是的。它适用于 LIKE,但我想知道为什么它不适用于 CONTAINS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
相关资源
最近更新 更多