【问题标题】:What does the TopScoreDocCollector in Lucene by default use for Scoring?Lucene 中的 TopScoreDocCollector 默认使用什么进行评分?
【发布时间】:2015-05-08 02:13:25
【问题描述】:

我想使用 Lucene 处理几百万条新闻数据。我对 Lucene 很陌生,所以我正在尝试越来越多地了解它是如何工作的。

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

你可以这样创建它

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

它稍后会收集您的查询结果(仅收集您在 hitsPerPage 中定义的数量)。我最初认为获取的结果只是随机分布的或其他东西(比如你有 100.000 个与您的查询匹配的文档,只是随机得到 10.000 个)。我现在想我错了。

在阅读了更多关于 Lucene 的内容后,我来到了该课程的 javadoc(请参阅here)。这里说

收集得分最高的命中的收集器实现, 将它们作为 TopDocs 返回

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

您能否解释一下 TopcScoreDocCollector 中的 Scorer 如何对我的新闻文档进行评分,以及这是否对我有用?

【问题讨论】:

标签: java sorting indexing lucene scoring


【解决方案1】:

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

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

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

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

您可以为记分器(为文档分配分数)或收集器(汇总结果)实现自己的逻辑。

【讨论】:

    【解决方案2】:

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

    如果您对后者感兴趣,我建议您以http://en.wikipedia.org/wiki/Information_retrieval 为起点,以获取概览并深入研究整个主题。

    我个人认为这是具有巨大潜力的最有趣的领域之一,但我从来没有真正接触过它的“学术硬技能”。

    为了参数化可用的解决方案,至少对理论有一个概述是至关重要的——例如,有“挑战”,而有信息被手动索引/估价作为参考,以便能够比较程序的质量解决方案。

    基于这样的挑战,在我们向 lucene 提供 4 个不同的信息库之后,我们设法获得了比“开箱即用的 luceene”略高的质量(抱歉,几年前我几乎记不起因此缺少关键词。 .) 这些都是 lucene 本身的结果,但参数不同。

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

    对不起,如果我完全弄错了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-06
      • 2015-08-22
      • 2013-05-23
      • 2013-07-05
      • 1970-01-01
      • 2015-02-04
      • 2013-03-01
      • 2013-08-14
      相关资源
      最近更新 更多