我正在使用lucene进行索引和搜索。以下是我用于搜索的代码。但是在当前代码中,对结果进行了排序。但是我希望结果基于相关性。假设如果我搜索“ abc”之类的词,我希望搜索得到的结果匹配“ abc”,然后匹配“ ab”或“ bc”,最后匹配“ a”,“ b”,“ c”,但当前结果被排序。
当我们对多个单词进行搜索时,有人可以建议我如何根据相关性检索结果。谢谢你的帮助。
最佳答案
默认情况下,Lucene仅基于TEXT-RELEVANCE进行排序。有很多因素会影响相关性得分。
tf-idf值和长度归一化可能会影响您的分数,从而导致“ a b” /“ b c”文档比包含“ a b c”的文档排名更高。
上面您可以克服的方法是根据匹配查询词的数量来提高相关性得分。您可以按照以下步骤操作。
1)编写一个自DefaultSimilarity扩展的自定义相似类。如果您想知道相似性是什么,Lucene使用的类包含有助于评分的所有评分因子公式。
教程:Lucene Scoring
2)覆盖DefaultSimilarity.coord()
Lucene文档中的coord()说明。
coord(q,d) is a score factor based on how many of the query terms are found in the specified document. Typically, a document that contains more of the query's terms will receive a higher score than another document with fewer query terms. This is a search time factor computed in coord(q,d) by the Similarity in effect at search time.
3)坐标的默认实现是重叠/最大重叠。您可以尝试使用不同的公式,以使包含更多查询词的文档出现在顶部结果中。以下公式可能是一个很好的起点。
1) coord return value = Math.sqrt(overlap/maxoverlap)
2) coord return value = overlap;
4)您不必重写其他方法,因为DefaultSimilarity具有所有评分因子的默认实现。只需触摸您要尝试的那个,在您的情况下就是coord()即可。如果从Similarity扩展,则必须提供所有实现。
5)可以使用IndexSearcher.setSimilarity()将相似性传递给IndexSearcher
关于java - Lucene:根据相关性进行搜索和检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16029794/