Lucene中的TopScoreDocCollector默认用于评分?

时间:2015-03-06 13:03:35

标签: java sorting indexing lucene scoring

我想使用Lucene处理数百万条新闻数据。我对Lucene很陌生,所以我正在努力学习它是如何工作的。

通过Web上的几个教程,我发现TopScoreDocCollector类与查询Lucene索引具有高度的相关性。

您可以像这样创建

int hitsPerPage = 10000;
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);

它稍后会收集查询结果(只有您在hitsPerPage中定义的数量)。我最初认为所采用的结果只是随机分布或其他东西(就像你有100.000文件匹配你的查询,只是随机10.000)。我想现在我错了。

在阅读了越来越多关于Lucene之后,我来到了班级的javadoc(请参阅here)。在这里说

  

收集得分最高的点击率的收集器实现,   将它们作为TopDocs返回

所以对我而言,现在似乎Lucene正在使用一些非常智能的技术以某种方式返回我输入查询的最高得分文档。但那个Scorer是如何工作的呢?他考虑了什么?我已经扩展了我对这个主题的研究,但找不到我到目前为止完全理解的答案。

你能解释一下TopcScoreDocCollector中的Scorer如何评分我的新闻文件,以及这对我有用吗?

2 个答案:

答案 0 :(得分:0)

Lucene使用反向索引在与您的查询匹配的文档ID列表上生成迭代器。

然后通过它们中的每一个并计算得分。默认情况下,该分数基于所谓的Tf-idf。简而言之,它将考虑查询条款在文档中出现的次数,以及包含该术语的文档数量。

这个想法是,如果你寻找(仓库工作),多次使用这个词并不像多次使用仓库那么重要。

然后,lucene不是对整组匹配文档进行排序,而是考虑到您实际上只需要前K个文档的事实。使用堆(或优先级队列),可以计算这些前K个,复杂度为O(N log K)而不是O(N log N)。 这就是TopScoreDocCollector的作用。

您可以为记分员(为文档指定分数)或收集器(聚合结果)实现自己的逻辑。

答案 1 :(得分:-1)

这可能不是最好的答案,因为迟早有人可以解释Lucene的内部行为,但根据我作为学生的日子,有两件事关于"信息检索" - 一个是利用现有的解决方案,如Lucene和那些 - 另一个是它背后的整个理论。

如果您对后一个感兴趣,我建议以http://en.wikipedia.org/wiki/Information_retrieval为出发点来概述并深入了解整个主题。

我个人认为这是最有趣的领域之一,具有巨大的潜力,但我从来没有过这样的学术技能#34;真的与它取得联系。

为了对可用的解决方案进行参数化,至少要对该理论进行概述是至关重要的 - 例如" challanges"而有信息被手动索引/估价作为参考,以便能够比较程序解决方案的质量。

基于这样一个挑战,我们设法获得了比开箱即用的更高质量的产品" luceene"在我们用4种不同的信息库喂养luceene之后(对不起,几年前我几乎记得因为缺少关键词......)这些都是luceene本身的结果,但是参数不同。

回到你的问题,我可以直接回答,但希望给你一个确定的基础,以确定你是否真的需要/想知道luceene背后的内容,或者你是否只想将它用作黑盒子(和或通过参数化使其成为灰盒子

对不起,如果我弄错了你。