问题 Lucene搜索的复杂性


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

O(|D|+|T|) 

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

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

谢谢


12131
2017-08-24 10:20


起源



答案:


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) 是给定术语的已提交查询的权重。请注意,查询被视为a bag of words 并且可以考虑权重向量(就好像它是另一个文档)。
  • wf(d,q) 是查询和文档的对数项加权

如下所述: 矢量点积的复杂性,矢量点积是 O(n)。这里的维度是我们词汇表中的术语数量: |T|,哪里 T 是一组术语。

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

O(|Q|· |D| · |T|) = O(|D| · |T|) 

我们考虑| Q |固定,在哪里 Q 是查询中的单词集(平均大小很低,平均查询有2到3个术语)和 D 是所有文件的集合。

但是,对于搜索,这些集合是有界的,索引不会经常增长。因此,使用VSM的搜索速度非常快(当时 T 和 D 很大,搜索非常慢,人们必须找到另一种方法)。


12
2017-08-31 10:19



旧答案,但我想知道在搜索查询中使用通配符是否会改变复杂性?处理它们有何不同? - mhlz
很棒的答案!是否有任何书籍或学术参考? - Salias


答案:


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) 是给定术语的已提交查询的权重。请注意,查询被视为a bag of words 并且可以考虑权重向量(就好像它是另一个文档)。
  • wf(d,q) 是查询和文档的对数项加权

如下所述: 矢量点积的复杂性,矢量点积是 O(n)。这里的维度是我们词汇表中的术语数量: |T|,哪里 T 是一组术语。

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

O(|Q|· |D| · |T|) = O(|D| · |T|) 

我们考虑| Q |固定,在哪里 Q 是查询中的单词集(平均大小很低,平均查询有2到3个术语)和 D 是所有文件的集合。

但是,对于搜索,这些集合是有界的,索引不会经常增长。因此,使用VSM的搜索速度非常快(当时 T 和 D 很大,搜索非常慢,人们必须找到另一种方法)。


12
2017-08-31 10:19



旧答案,但我想知道在搜索查询中使用通配符是否会改变复杂性?处理它们有何不同? - mhlz
很棒的答案!是否有任何书籍或学术参考? - Salias


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


0
2017-08-15 13:21