我需要使用Oracle11g的contained ()函数来搜索用户键入的某个字段中包含的确切文本。我被要求不要使用“喜欢”操作符。
根据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',我发现这段文字匹配非常令人惊讶。有什么地方我不了解there ()的语法吗?
发布于 2013-10-28 09:10:10
CONTAINS一点也不像LIKE运算符。因为它使用的是ORACLE TEXT搜索引擎(比如google ),而不仅仅是字符串匹配。
{} -是一个转义标记。意味着你放进去的所有东西都应该被当作文本来转义。
因此,您可以发出查询来查找看起来像a or b的文本,而不是a或b。因此,您的查询将与Pdz344_1_b匹配,因为其中包含b char。
只有a字符的行不匹配,因为a字符存在于默认停止列表中。
为什么b不匹配?因为您的匹配序列实际上看起来像a\ or\ b。因此,我们有3个令牌a _or _b (下划线表示空格)。停止列表中的a,并且在b行中没有字符串_b,因为只有一个字符。但是我们在Pdz344_1_b行中确实有这个组合,因为非字母字符被视为空白。如果您删除了{}或{b or a}查询,那么您也会得到与b匹配的结果。
https://stackoverflow.com/questions/19629864
复制相似问题