【问题标题】:Lucene: Search and retrieve based on relevanceLucene:根据相关性进行搜索和检索
【发布时间】:2013-04-08 10:19:17
【问题描述】:

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

当我们搜索多个单词时,有人可以建议我如何根据相关性检索结果吗?感谢您的帮助。

【问题讨论】:

标签: java lucene


【解决方案1】:

默认情况下,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多