如何用“like”运算符查询lucene?

时间:2010-07-22 10:33:04

标签: java lucene sql-like

通配符*只能在单词的末尾使用,例如user*

我想查询类似%user%,如何做到这一点?

4 个答案:

答案 0 :(得分:14)

LIKE查询的问题在于执行时间expensive。您可以设置QueryParser以允许使用以下前导通配符:

QueryParser.setAllowLeadingWildcard(true)

这将允许您进行以下搜索:

*user*

但这需要很长时间才能执行。有时当人们说他们想要LIKE查询时,他们真正想要的是fuzzy query。这将允许您进行以下搜索:

user~

哪个符合usersfuser这两个词。您可以使用介于0和1之间的浮点值指定查询中的字词与要匹配的字词之间的编辑距离。例如,user~0.8将匹配多于user~0.5的字词。

我建议你也看看regex query,它支持Lucene搜索的正则表达式语法。它可能更接近你真正需要的东西。也许是这样的事情:

.*user.*

答案 1 :(得分:11)

Lucene提供允许进行* user等领先通配符搜索的ReverseStringFilter。它的工作原理是按相反顺序索引所有术语。

但我认为没有办法做类似'LIKE%user%'的事情。

答案 2 :(得分:6)

自Lucene 2.1起,您可以使用

QueryParser.setAllowLeadingWildcard(true);

但这可能会影响性能。 LuceneFAQ还有更多信息。

答案 3 :(得分:4)

当你考虑它时,lucene对通配符的支持(通常)仅限于字模式末尾的通配符并不奇怪。

关键字搜索引擎的工作原理是创建语料库中所有单词的反向索引,该索引按字顺序排序。当您执行常规非通配符搜索时,引擎会使用以下事实:索引条目已排序,以便在O(logN)步骤中找到您的单词的条目,其中N是单词的数量或条目。对于带有后缀通配符的单词模式,同样的事情恰好找到第一个匹配的单词,并通过扫描条目找到其他匹配,直到模式的固定部分不再匹配。

但是,对于带有通配符前缀通配符后缀的单词模式,引擎必须查看索引中的所有条目。这将是O(N) ...除非引擎构建了一整堆二级索引来匹配单词的字面子串。 (这会使索引变得更加昂贵)。对于更复杂的模式(例如正则表达式),搜索引擎的问题会更严重。