2012-11-15 71 views
7

如果搜索“bahnhofstrasse”,我希望Lucene找到包含术语“bahnhofstr”的文档,即,我不要只想查找包含我的搜索字词作为前缀的条款的文档,以及包含本身就是我的搜索字词前缀的字词的文档...在索引中搜索作为搜索词的前缀的词(反之亦然)(!)

我该如何解决这个问题?

+0

相关(但不给你一个合适的回答,只是说:“是的,你可以“):http:// stackoverflow。com/questions/10671755/lucene-prefix-search-for-indexed-data-through-standard-analyser – Thilo

+1

没有看到反之亦然的部分。所以你也想打“b”?有最小长度吗? – Thilo

+0

是的,有些情况下我也想打“b”。想象一下只有内容“D”的字段“first_name”... –

回答

0

我认为模糊查询可能对您最有帮助。这将根据来自查询的Levenshtein距离对项进行评分。如果没有指定最小相似度,它将有效匹配每个可用的术语。这可以使其不足性能,但确实实现了您正在寻找的内容。

模糊查询由〜字符信号发送,如:

firstname:bahnhofstr~ 

或者与最小相似度(0和1,0之间的一个数是最宽松没有最低)

firstname:bahnhofstr~0.4 

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

这不完全是您指定的内容,而是最简单的方法。

至于你正在寻找什么,我不知道一个简单的Lucene调用来完成它。我可能会术语只是分成了一系列termqueries的,你可以在查询字符串类似表示:

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

我不会真的产生查询字符串,它自己,顺便说一句。我只是自己构造TermQuery和PrefixQuery对象。

评分会有点扭曲,我可能会提高更长时间的查询以更好地排序,但这是想到的方法,可以非常容易地完成您正在寻找的内容。一个DisjunctionMaxQuery将帮助你使用这样的事情与其他条款,并获得更合理的评分。

但愿模糊查询适合您。似乎更好的解决方案。

另一种选择,如果你有很多需要这种性质的查询,可能是,当索引记号化领域为正克(见NGramTokenizer),这样可以让你有效地使用NGramPhraseQuery达到的结果你要。

1

如果我理解正确的话,你的搜索字符串是一个确切的字符串,可以在Lucene的设置queryParser.setAllowLeadingWildcard(true);允许领先通配符搜索(这可能会或可能不会慢 - 我已经看到他们相当快,但在一个只有60,000多个Lucene文档的情况)。

你举的例子查询语法可能看起来是这样的:

*bahnhofstr bahnhofstr* 

或可能(没有测试)刚:

*bahnhofstr*