通配符*只能在单词的末尾使用,例如user*
。
我想查询类似%user%
,如何做到这一点?
答案 0 :(得分:14)
LIKE查询的问题在于执行时间expensive。您可以设置QueryParser以允许使用以下前导通配符:
QueryParser.setAllowLeadingWildcard(true)
这将允许您进行以下搜索:
*user*
但这需要很长时间才能执行。有时当人们说他们想要LIKE查询时,他们真正想要的是fuzzy query。这将允许您进行以下搜索:
user~
哪个符合users
和fuser
这两个词。您可以使用介于0和1之间的浮点值指定查询中的字词与要匹配的字词之间的编辑距离。例如,user~0.8
将匹配多于user~0.5
的字词。
我建议你也看看regex query,它支持Lucene搜索的正则表达式语法。它可能更接近你真正需要的东西。也许是这样的事情:
.*user.*
答案 1 :(得分:11)
Lucene提供允许进行* user等领先通配符搜索的ReverseStringFilter。它的工作原理是按相反顺序索引所有术语。
但我认为没有办法做类似'LIKE%user%'的事情。
答案 2 :(得分:6)
答案 3 :(得分:4)
当你考虑它时,lucene对通配符的支持(通常)仅限于字模式末尾的通配符并不奇怪。
关键字搜索引擎的工作原理是创建语料库中所有单词的反向索引,该索引按字顺序排序。当您执行常规非通配符搜索时,引擎会使用以下事实:索引条目已排序,以便在O(logN)
步骤中找到您的单词的条目,其中N
是单词的数量或条目。对于带有后缀通配符的单词模式,同样的事情恰好找到第一个匹配的单词,并通过扫描条目找到其他匹配,直到模式的固定部分不再匹配。
但是,对于带有通配符前缀和通配符后缀的单词模式,引擎必须查看索引中的所有条目。这将是O(N)
...除非引擎构建了一整堆二级索引来匹配单词的字面子串。 (这会使索引变得更加昂贵)。对于更复杂的模式(例如正则表达式),搜索引擎的问题会更严重。