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

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

我想用%user%查询,怎么做?

Lucene提供了ReverseStringFilter ,它允许像* user一样进行前导通配符搜索。 它的工作原理是按相反顺序索引所有术语。

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

LIKE查询的问题在于它们在执行时间方面很昂贵 。 您可以设置QueryParser以允许带有以下内容的前导通配符:

QueryParser.setAllowLeadingWildcard(true)

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

*user*

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

user~

哪个匹配usersfuser的术语。 您可以使用0到1之间的浮点值指定查询中的术语与要匹配的术语之间的编辑距离。例如, user~0.8将匹配比user~0.5更多的术语user~0.5

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

.*user.*

自从Lucene 2.1你可以使用

 QueryParser.setAllowLeadingWildcard(true); 

但这可能会扼杀性能。 LuceneFAQ有更多信息。

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

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

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