Lucene搜索的复杂性

时间:2012-08-24 10:20:37

标签: lucene complexity-theory

如果我编写并使用Lucene执行搜索的算法,我如何说明它的计算复杂性?我知道Lucene使用tf * idf得分,但我不知道它是如何实现的。我发现tf * idf具有以下复杂性:

O(|D|+|T|) 

其中D是文档集,T是所有术语集。

但是,我需要有人能够检查这是否正确并解释原因。

谢谢

2 个答案:

答案 0 :(得分:12)

Lucene基本上使用Vector Space Model(VSM)和tf-idf方案。因此,在标准设置中我们有:

  • 每个表示为向量的文档集合
  • 文本查询也表示为向量

我们确定查询K上具有最高向量空间分数的集合的q文档。通常情况下,我们会按降序排列得分这些K顶级文件;例如,许多搜索引擎使用K = 10来检索和排序十个最佳结果的第一页。

计算向量空间分数的基本算法是:

float Scores[N] = 0
Initialize Length[N]
for each query term t
do calculate w(t,q) and fetch postings list for t (stored in the index)
    for each pair d,tf(t,d) in postings list
    do Scores[d] += wf(t,d) X w(t,q)  (dot product)
Read the array Length[d]
for each d
do Scored[d] = Scores[d] / Length[d]
return Top K components of Scores[]

哪里

  • 数组Length包含每个N的长度(规范化因子) 文档,而数组Scores保存每个文档的分数。
  • tf是文档中术语的术语频率。
  • w(t,q)是指定字词的已提交查询的权重。请注意,查询被视为bag of words,可以考虑权重向量(就好像它是另一个文档)。
  • wf(d,q)是查询和文档的对数术语加权

如此处所述:Complexity of vector dot-product,矢量点积为O(n)。这里的维度是我们词汇表中的术语数量:|T|,其中T是术语集。

因此,该算法的时间复杂度为:

O(|Q|· |D| · |T|) = O(|D| · |T|) 
我们考虑| Q |已修复,其中Q是查询中的单词集(平均大小较低,平均查询有2到3个术语),D是所有文档的集合。

但是,对于搜索,这些集合是有界的,索引不会经常增长。因此,使用VSM的搜索非常快(当TD很大时,搜索速度非常慢,而且必须找到替代方法。)

答案 1 :(得分:0)

  

D是所有文档的集合

在VSM之前(诚实地),布尔检索被调用。因此,我们可以说d仅与文档匹配(在最佳情况下几乎可以)。 由于Scores是优先级队列(至少在doc-at-time-scheme模式下)是基于堆构建的,因此将每个d放入log(K)中。 因此,我们可以将其估计为O(d·log(K)),在这里我省略了T,因为预计查询会很短。 (否则,您会遇到麻烦)。

http://www.savar.se/media/1181/space_optimizations_for_total_ranking.pdf