我需要比较不同Lucene查询中搜索结果的相关性。Lucene:比较查询结果
其实我有一套索引的文本文档,当对这个集合进行搜索时,我想从这个集合中返回N个最好的结果,但是所有符合查询的结果“足够好”。这个“足够好”的参数是可配置的(比如0(文档是绝对不相关的)和1(文档是最好的匹配)),但我希望它以同样的方式影响所有查询。
从我在互联网上发现它不是一个简单的任务。有人可以给我一个关于如何解决这个问题的提示吗?
非常感谢!
我需要比较不同Lucene查询中搜索结果的相关性。Lucene:比较查询结果
其实我有一套索引的文本文档,当对这个集合进行搜索时,我想从这个集合中返回N个最好的结果,但是所有符合查询的结果“足够好”。这个“足够好”的参数是可配置的(比如0(文档是绝对不相关的)和1(文档是最好的匹配)),但我希望它以同样的方式影响所有查询。
从我在互联网上发现它不是一个简单的任务。有人可以给我一个关于如何解决这个问题的提示吗?
非常感谢!
即使你归分数为[0,1]区间,这显然是不正确的比较不同的查询分数,请参阅How to normalize Lucene scores?
我只是在寻找这个问题的答案同样的问题。下面是我在环顾四周发现:
虽然in general it is not possible to compare across queries,如果你有一定的限制类型的查询,如BooleanQuery
只由TermQuery
s,则it may be possible to compare results across queries if you disable the coord boost in the BooleanQuery constructor的。
如果您想比较两个或多个查询,我找到了一种解决方法。您可以使用LevenstheinDistance或LuceneLevenstheinDistance(Damerau)类来比较您的得分最高的文档与您的queryterm,以获取queryterm与结果之间的距离。
结果是它们之间的相似性。为每个要比较的查询执行此操作。现在您有了一个工具来使用queryterm的相似度和最高结果来比较您的查询。您现在可以选择具有最高相似度的查询,并将其用于下一个适当的操作。
//Damerau LevenstheinDistance
LuceneLevenshteinDistance d = new LuceneLevenshteinDistance();
similiarity = d.getDistance(queryterm, yourResult);
@piyushj谢谢你纠正我btw :) – Blackeye
不确定你的意思?你想限制查询结果吗?用Solr很容易做到这一点。用Lucene你需要编写一个自定义收集器:看看这里http://stackoverflow.com/questions/2871558/remove-results-below-a-certain-score-threshold-in-solr-lucene – Mikos
感谢Mikos,但是因为它写在Shashikant Kore的评论中,评分与查询有关,因此我不能使用相同的阈值来衡量跨多个查询的结果“好”。我正在研究以某种方式规范化分数的方式,以便这些规范化的值对于所有查询的“善良”而言意味着相同。 – Serpenty
啊!我想我能更好地理解你的问题,但觉得这比Lucene本身更适合统计。您可能希望在统计中查找方差分析或卡方检验,同时可以帮助您使用结果文档分数阵列确定跨查询的适合度。 HTH。 – Mikos