我正在使用Apache Lucene,目前正在尝试将模糊和前缀(或通配符)查询结合起来,以实现一种建议机制。
例如,如果查询是征费,则还应返回包含 Levinshtein 的文档。
由于在Lucene中似乎没有此类内置查询,我已经搜索了解决方案并使用了此处建议的方法 Lucene query: bla~* (match words that start with something fuzzy), how?,它将查询创建为两个Automata(第二个回复)的组合。
这确实很有效,但现在的问题是没有得分。所有结果都得到 1.0 的结果。我真的想要" Levy"比排名更高的" Levninshtein"在上一个例子中。
顺便说一句,我尝试以FuzzySuggester的形式使用Lucene自动建议,但是对于大输入它是不可行的,它在RAM中保留所有建议并且膨胀了内存使用。
还有另一种方法吗?或者我应该实施自己的得分手或相似性?
答案 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