Lucene:根据相关性进行搜索和检索

时间:2013-04-16 06:00:12

标签: java lucene

我正在使用lucene进行索引和搜索。下面是我用于搜索的代码。但是在当前代码中,结果是排序的。但我希望结果基于相关性。假设如果我搜索像“abc”这样的单词,我希望我的搜索得到的结果与“abc”匹配,然后是“ab”或“bc”,最后是“a”,“b”,“c”,但目前结果排序。

当我们搜索多个单词时,有人会建议我如何根据相关性检索结果。谢谢你的帮助。

1 个答案:

答案 0 :(得分:6)

默认情况下,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)coord的默认实现是overlap / maxoverlap。您可以尝试使用不同的公式,以便包含更多查询字词的文档显示在最顶层的结果中。以下公式可能是一个很好的起点。

   1) coord return value = Math.sqrt(overlap/maxoverlap)
   2) coord return value = overlap;

4)您不必覆盖其他方法,因为DefaultSimilarity具有所有评分因子的默认实现。只需触摸您要试验的那个,即您的情况下的coord()。如果您从Similarity延伸,则需要提供所有实现。

5)可以使用IndexSearcher.setSimilarity()

将相似性传递给IndexSearcher
相关问题