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

标签 java lucene

我正在使用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/

相关文章:

regex - RegEx用于匹配Lucene中的任何2个字母+任何6个数字

lucene - mg4j 与 apache lucene

java - 在 Java 中查找 2d n*n 矩阵的逆矩阵?

java - 客户端日期时间与服务器日期时间不匹配

java - 带有占用指示器的命令行进度条

solr - 有没有办法用不同的配置文件运行 NUTCH?

java - 为什么我们必须声明对 JBOSS 8 (wildfly) list 的依赖?

java - Android 带有数字的字符串资源

java - 如何使用 Hibernate Lucene Search 进行不区分大小写的排序?

Lucene LongField 使用 Query 进行精确搜索