lucene如何快速计算文件的交集?

时间:2011-10-07 23:56:58

标签: search lucene full-text-search full-text-indexing

允许存储和搜索的内部结构是什么?如同细节一样?

例如,我有一百万个文档与一个术语匹配,一百万个其他文档与一个AND查询的第二个术语相匹配。 lucene如何快速地为我提供顶级k?

它是否按照每个学期增加doc IDS的顺序存储文档?然后,当两个术语的文档必须相交时,它会通过在一次传递中逐步迭代它们来查找两个集合中的第一个常见k文档。

或者,它是否使用较大的文档数组中的简单无序哈希集来查找常用文档?

或者是否使用这种(或可能更多)类型的交叉点政策取决于用户提出的文件数量,与个别条款相匹配的文件等等?

任何可以指出文档数组合并的细节的文章都将受到赞赏。

编辑: 谢谢你们的信息。现在有道理。跳过列表可以发挥魔力。我将深入挖掘它以获得清晰的理解。

3 个答案:

答案 0 :(得分:4)

  1. 索引包含已排序的文档。当您使用和运算符(term1 AND term2)查询时,它使用两个迭代器,因此当您知道第一个term1以docN开头时,您可以跳过term2的所有文档直到docN。因此,不仅迭代器具有下一个方法,而且非常有效的skipTo方法。它使用Skip list index(http://en.wikipedia.org/wiki/Skip_list)实现。 因此,通过使用next next和skipTo,我们可以非常快速地在大块上进行迭代,并且由于数据稀疏(例如,对于通常的数据库不起作用),它非常有效。
  2. 其他一点,lucene只保留N最佳,因此它比排序所有分数文件快得多。如果您要求最好的10个,那么比请求20个最佳文档快两倍

答案 1 :(得分:1)

Lucene将根据情况与已排序的文档ID相交或使用bitset的窗口。请参阅BooleanScorer顶部的评论。

答案 2 :(得分:1)

交点类似于sort-merge join,但ID已经排序。有关详细信息,请参阅this blog post