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

Guy*_*sei 11 lucene search full-text-search full-text-indexing

存储和搜索的内部包含哪些内容?如同细节一样?

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

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

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

或者是否使用这种(或可能更多)类型的交叉点策略取决于用户提出的文档数量,与个别术语匹配的那些因素以及其他因素?

任何可以指出文档数组合并的细节的文章将不胜感激.

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

yur*_*ura 5

  1. 索引包含排序的文档。当您使用 and 运算符(term1 AND term2)查询时,它使用两个迭代器,因此当您知道第一个 term1 以 docN 开头时,您可以跳过 term2 直到 docN 的所有文档。所以不仅有带有next方法的迭代器,还有非常高效的skipTo方法。它是通过跳过列表索引(http://en.wikipedia.org/wiki/Skip_list)实现的。因此,通过使用 next 和skipTo 方法,我们可以非常快速地迭代大块,并且由于数据稀疏(例如,这些方法不适用于通常的数据库),因此非常高效。
  2. 另外一点是 lucene 只保存 N 个最好的内容,因此它比对所有分数文档进行排序要快得多。如果您请求 10 个最佳文档,速度比您请求 20 个最佳文档快两倍


A. *_*ady 1

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