2

我需要使用 Oracle 11g 的 Contains() 函数来搜索用户键入的某些字段中包含的某些确切文本。我被要求不要使用“喜欢”运算符。

根据Oracle 文档,要使一切正常工作,您需要:

  • }字符
  • 将整个输入放在{}

这在大多数情况下都有效,除了少数情况。下面是一个测试用例:

create table theme
  (name varchar2(300 char) not null);

insert into theme (name)
values ('a');

insert into theme (name)
values ('b');

insert into theme (name)
values ('a or b');

insert into theme (name)
values ('Pdz344_1_b');

create index name_index on theme(name) indextype is ctxsys.context;

如果'or'运算符被解释,我会得到所有四个结果,但希望不是这样。现在,如果我运行以下命令,我希望只能找到'a or b'.

select * from theme
where contains(name, '{a or b}')>0;

不过我也明白了'Pdz344_1_b'。但是没有'a''o'没有'r',我发现这个文本匹配非常令人惊讶。关于 contains() 的语法有什么我不明白的吗?

4

1 回答 1

4

CONTAINS根本不像LIKE操作员。由于它使用ORACLE TEXT搜索引擎(类似于谷歌搜索),而不仅仅是字符串匹配。

{}- 是一个逃生标记。意味着您放入的所有内容都应视为要转义的文本。

因此,您发出查询以查找看起来a or b不像a或的文本b。所以你的查询得到匹配,Pdz344_1_b因为它有bchar 。

只有a字符的行不匹配,因为a字符存在于默认停止列表中

为什么只是b不匹配?因为您的匹配序列实际上看起来像a\ or\ b. 所以我们有 3 个标记a _or _b(下划线代表空格)。a在停止列表中,我们在行中没有字符串_bb因为只有单个字符。但是我们在行中确实有这种组合Pdz344_1_b,因为非字母字符被视为空格。如果您删除{}或查询, {b or a}那么您也会得到匹配项b

于 2013-10-28T09:10:10.830 回答