7

如果我搜索“bahnhofstrasse”,我希望 Lucene 找到包含术语“bahnhofstr”的文档,即,我不仅想查找包含我的搜索词作为前缀的术语的文档,还想查找包含术语的文档它们本身就是我的搜索词的前缀......

我该怎么办?

4

2 回答 2

1

如果我对您的理解正确,并且您的搜索字符串是一个确切的字符串,您可以queryParser.setAllowLeadingWildcard(true);在 Lucene 中设置以允许前导通配符搜索(这可能会或可能不会很慢 - 我已经看到它们相当快,但在有只有 60,000 多个 Lucene 文档)。

您的示例查询语法可能类似于:

*bahnhofstr bahnhofstr*

或者可能(没有测试过)只是:

*bahnhofstr*
于 2013-02-08T18:57:25.743 回答
0

我认为模糊查询可能对您最有帮助。这将根据与您的查询的 Levenshtein 距离对术语进行评分。如果没有指定最小相似度,它将有效地匹配每个可用的术语。这可能会使其性能不佳,但确实可以完成您正在寻找的东西。

模糊查询由 ~ 字符表示,例如:

firstname:bahnhofstr~

或具有最小相似性(0 到 1 之间的数字,0 是最松散的,没有最小值)

firstname:bahnhofstr~0.4

或者,如果您正在构建自己的查询,请使用FuzzyQuery

这与您指定的不太完全一致,但却是最简单的接近方式。

至于你正在寻找什么,我不知道一个简单的 Lucene 调用来完成它。我可能只是将术语拆分为一系列术语查询,您可以在查询字符串中表示如下:

firstname:b
firstname:ba
firstname:bah
firstname:bahn
firstname:bahnh
firstname:bahnho
firstname:bahnhof
firstname:bahnhofs
firstname:bahnhofst
firstname:bahnhofstr*

顺便说一句,我自己实际上不会为它生成查询字符串。我只是自己构建 TermQuery 和 PrefixQuery 对象。

评分会有点扭曲,我可能会更高地提升更长的查询以获得更好的排序,但这是我想到的方法,可以很容易地完成你正在寻找的东西。DisjunctionMaxQuery将帮助您将此类内容与其他术语一起使用并获得更合理的评分。

希望模糊查询对您有用。似乎是一个更好的解决方案。

如果您对这种性质的查询有很多需求,另一种选择可能是在索引时将字段标记为 n-gram(请参阅NGramTokenizer),这将允许您有效地使用NGramPhraseQuery来实现您想要的结果。

于 2012-11-15T21:35:45.863 回答