AutomatonQuery的得分结果

时间:2015-02-17 15:34:07

标签: lucene wildcard fuzzy-search scoring

我正在使用Apache Lucene,目前正在尝试将模糊和前缀(或通配符)查询结合起来,以实现一种建议机制。

例如,如果查询是征费,则还应返回包含 Levinshtein 的文档。

由于在Lucene中似乎没有此类内置查询,我已经搜索了解决方案并使用了此处建议的方法 Lucene query: bla~* (match words that start with something fuzzy), how?,它将查询创建为两个Automata(第二个回复)的组合。

这确实很有效,但现在的问题是没有得分。所有结果都得到 1.0 的结果。我真的想要" Levy"比排名更高的" Levninshtein"在上一个例子中。

顺便说一句,我尝试以FuzzySuggester的形式使用Lucene自动建议,但是对于大输入它是不可行的,它在RAM中保留所有建议并且膨胀了内存使用。

还有另一种方法吗?或者我应该实施自己的得分手相似性

1 个答案:

答案 0 :(得分:1)

可以通过MultiTermQuery中的基本重写方法轻松解决它。

正如javadoc所说:

  

推荐的重写方法是CONSTANT_SCORE_AUTO_REWRITE_DEFAULT:   它没有花费CPU计算无益的分数,它试图   在给定查询的情况下选择性能最佳的重写方法。如果你   需要得分(如{@link FuzzyQuery},请使用{@link   TopTermsScoringBooleanQueryRewrite}使用优先级   排队只收集竞争条款,而不是打这个   限制。

这意味着对于性能优化,它们默认使用常量评分。 所以,你唯一需要做的就是:

MultiTermQuery query = new AutomatonQuery(new Term("text"), Automata.makeAnyString());
        query.setRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE);

有关详细信息,请查看我的测试:https://github.com/MysterionRise/information-retrieval-adventure/blob/master/src/main/java/org/mystic/lucene/AutomatonScoringTest.java