【问题标题】:Complexity of a Lucene's searchLucene 搜索的复杂性
【发布时间】:2012-08-19 21:46:36
【问题描述】:

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

O(|D|+|T|) 

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

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

谢谢

【问题讨论】:

    标签: lucene complexity-theory


    【解决方案1】:

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

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

    我们在查询q 上确定集合中向量空间得分最高的K 文档。通常,我们按照分数降序查找这 K 个 top 文档;例如,许多搜索引擎使用 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 很大时,搜索速度非常慢,必须找到替代方法)。

    【讨论】:

    • 旧答案,但我想知道在搜索查询中使用通配符是否会改变复杂性?处理方式不同吗?
    • 很好的答案!有没有这方面的书籍或学术参考?
    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      相关资源
      最近更新 更多