我需要使用Oracle 11g的Contains()函数来搜索用户输入的某些字段中包含的一些确切文本。我被要求不要使用'like'操作符。
根据Oracle documentation,您需要完成所有工作:
}
个字符{}
除了少数情况外,大多数情况下都有效。下面是一个测试用例:
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()的语法?
答案 0 :(得分:4)
CONTAINS
与LIKE
运算符完全不同。由于它使用ORACLE TEXT
搜索引擎(类似谷歌搜索),而不仅仅是字符串匹配。
{}
- 是一个逃脱标记。意味着你放在里面的一切都应当被视为文本以逃避。
因此,您发出查询以查找看起来像a or b
的文字,而不是a
或b
。
因此,您的查询会与Pdz344_1_b
匹配,因为其中包含b
个字符。
仅a
字符的行未匹配,因为default stop list中存在a
字符。
为什么b
不匹配?因为您的匹配序列实际上看起来像a\ or\ b
。
我们有3个令牌a
_or
_b
(下划线代表空格)。停止列表中的a
,_b
行中没有字符b
,因为只有一个字符。但我们在Pdz344_1_b
行中确实有这种组合,因为非字母字符被视为空格。如果您移除{}
或查询{b or a}
,那么您也会获得与b
的匹配。