Lucene的复杂性';s搜索

Lucene的复杂性';s搜索,lucene,complexity-theory,Lucene,Complexity Theory,如果我编写了一个使用Lucene执行搜索的算法,我如何陈述它的计算复杂性?我知道Lucene使用tf*idf评分,但我不知道它是如何实现的。我发现tf*idf具有以下复杂性: O(|D|+|T|) 其中D是文件集,T是所有术语集 然而,我需要有人谁可以检查这是正确的,并解释我为什么 谢谢Lucene基本上使用了一个带有tf idf方案的向量空间模型(VSM)。因此,在标准设置中,我们有: 每个文档都表示为向量的文档集合 文本查询也表示为向量 我们确定在查询q中向量空间得分最高的集合的K文

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

O(|D|+|T|) 
其中D是文件集,T是所有术语集

然而,我需要有人谁可以检查这是正确的,并解释我为什么


谢谢

Lucene基本上使用了一个带有
tf idf
方案的
向量空间模型
(VSM)。因此,在标准设置中,我们有:

  • 每个文档都表示为向量的文档集合
  • 文本查询也表示为向量
我们确定在查询
q
中向量空间得分最高的集合的
K
文档。通常,我们按分数降序查找这些K top文档;例如,许多搜索引擎使用K=10来检索和排序十个最佳结果的第一页

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

浮动分数[N]=0
初始化长度[N]
对于每个查询项t
计算w(t,q)并获取t的过账列表(存储在索引中)
对于过帐列表中的每对d,tf(t,d)
do分数[d]+=wf(t,d)X w(t,q)(点积)
读取数组长度[d]
每d
do得分[d]=得分[d]/长度[d]
返回得分的前K个分量[]
在哪里

  • 数组
    Length
    保存每个
    N
    文档,而数组
    得分
    保存每个文档的得分
  • tf
    是文档中某个术语的术语频率
  • w(t,q)
    是针对给定术语提交的查询的权重。请注意,查询被视为一个
    单词包
    ,可以考虑权重向量(就好像它是另一个文档一样)
  • wf(d,q)
    是查询和文档的对数项权重
如本文所述:,向量点积为
O(n)
。这里的维度是词汇表中的术语数量:
T
,其中
T
是术语集

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

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

我们认为q是固定的,其中<代码> q>代码>是查询中的一组单词(平均大小很低,平均查询有2到3个项),<代码> d>代码>是所有文档的集合。 然而,对于搜索,这些集合是有界的,索引不会经常增长。因此,使用VSM的搜索速度非常快(当

T
D
较大时,搜索速度非常慢,必须找到替代方法)

D
是所有文档的集合

在VSM之前(老实说,也就是说)调用布尔检索。因此,我们可以说
d
只匹配文档(几乎可以。在最好的情况下)。 由于
Scores
是在堆上构建的优先级队列(至少在doc-at-time方案中),因此将每个
d
放入takes
log(K)
。 因此,我们可以将其估计为
O(d·log(K))
,这里我省略
T
,因为预期查询很短。(否则,你就有麻烦了)


旧答案,但我想知道在搜索查询中使用通配符是否会改变复杂性?用不同的方式处理它们吗?回答得很好!有没有关于这方面的书或学术参考?