我创建了一个包含两列的表。我插入了两行。
id name
1 narsi reddy
2 narei sia
一个是简单的数字类型,另一个是CLOB类型。所以我决定使用索引。我通过使用contains来查询。 查询:
select * from emp where contains(name,'%a%e%')>0
2 narei sia
我预计2会来,但不会。但是,如果我给予它同样的给予我想要的东西。 查询:
select * from emp where name like '%a%e%'
ID NAME
1 (CLOB) narsi reddy
2 (CLOB) narei sia
2 rows selected
最后我明白,就像搜索整个文档或段落一样,但是包含的是单词。
那么如何获得所需的输出?
答案 0 :(得分:25)
LIKE和CONTAINS是根本不同的搜索方法。
LIKE是一个非常简单的字符串模式匹配器 - 它识别两个通配符(%)和(_)分别匹配零或多或一个字符。在您的情况下,%a%e%匹配表格中的两个记录 - 它会查找零个或多个字符,后跟a
,后跟零个或多个字符,后跟e
,后跟零个或多个字符。它的返回值也非常简单:它返回“匹配”或“不匹配” - 没有灰色阴影。
CONTAINS是一个功能强大的搜索工具,它使用上下文索引,它构建了一种可以使用CONTAINS搜索语法搜索的单词树。它可用于搜索单个单词,单词组合,并具有自己丰富的语法,例如布尔运算符(AND,NEAR,ACCUM)。它也更强大,它不是返回简单的“匹配”或“不匹配”,而是返回“得分”,可用于按相关性顺序对结果进行排名;例如CONTAINS(col,'dog NEAR cat')将为文档返回更高的分数,这两个单词都被发现在一起。
答案 1 :(得分:3)
我认为您的CONTAINS
查询与'narei sia'匹配,因为模式'%a%e%'与单词'narei'匹配。它与'narsi reddy'不匹配,因为单独拍摄的单词都不符合模式。
出于性能原因,我假设您要使用CONTAINS
而不是LIKE
。我绝不是CONTAINS
查询表达式的专家,但我没有看到一个简单的方法来进行你想要的精确搜索,因为你正在寻找可以在同一个单词或不同单词中的字母,但必须按给定的顺序发生。我认为最好将这两种技术结合起来:
WHERE CONTAINS(name,'%a% AND %e%') > 0
AND name LIKE '%a%e%'
我认为这将允许文本索引用于查找候选匹配(任何至少有一个单词包含'a'且至少一个单词包含'e'的东西)。然后,这些将被LIKE
条件过滤,强制要求字符串中的'a'在'e'之前。