【问题标题】:How does Lucene/Solr achieve high performance in multi-field / faceted search?Lucene/Solr 如何在多字段/分面搜索中实现高性能?
【发布时间】:2011-04-05 13:49:40
【问题描述】:

上下文

这是一个主要关于 Lucene(或者可能是 Solr)内部的问题。主要主题是分面搜索,其中可以沿着对象的多个独立维度(方面)进行搜索(例如汽车的大小、速度、价格)。

当使用关系数据库实现时,对于大量构面,多字段索引没有用处,因为可以按任何顺序搜索构面,因此使用特定有序多索引的机会很小,并创建所有可能的排序指数难以忍受。

Solr 被宣传为可以很好地处理分面搜索任务,如果我认为正确的话,它必须与 Lucene 相关联(据说)在多字段查询(文档的字段与对象的方面相关)上表现良好。

问题

Lucene的倒排索引可以存储在关系型数据库中,自然取匹配文档的交集也可以通过RDBMS使用单字段索引轻松实现。

因此,Lucene 应该有一些用于多字段查询的先进技术,而不仅仅是基于倒排索引获取匹配文档的交集。

所以问题是,这种技术/技巧是什么?更广泛地说:为什么 Lucene/Solr 在理论上可以实现比 RDBMS 更好的分面搜索性能(如果可以的话)?

注意:我的第一个猜测是 Lucene 会使用一些空间分割方法来分割从文档字段构建的向量空间作为维度,但据我了解,Lucene 并不是纯粹基于向量空间的。

【问题讨论】:

    标签: lucene internals faceted-search


    【解决方案1】:

    刻面

    分面有两种答案,因为分面有两种类型。我不确定其中任何一个都比 RDBMS 快。

    1. 枚举分面。查询的结果是一个位向量,如果第 i 个文档是匹配的,则第 i 个位为 1。刻面也是位向量,因此交集只是按位与。我不认为这是一种新颖的方法,而且大多数 RDBMS 可能都支持它。
    2. 字段缓存。这只是一个正常(非反转)索引。此处运行的 SQL 样式查询如下:

      从 field_cache 中选择 facet,count(*) query_results 中的 docId 在哪里 按方面分组

    再说一次,我不认为这是普通 RDBMS 无法做到的。索引是一个跳过列表,以 docId 为键。

    多词搜索

    这就是 Lucene 的亮点。为什么 Lucene 的方法这么好,这里就不多说了,不过我可以推荐this post on Lucene Performance,或者里面链接的论文。

    【讨论】:

    • 谢谢。您指向的帖子写道“Lucene 的真正优化来自这样一个事实,即您从不搜索与查询匹配的所有文档,而是搜索前 k 个文档。”。在分面搜索的情况下,我认为必须考虑所有匹配项。
    • @ron:是的,我不知道 Lucene 的多面查询性能非常好。但我不是这方面的专家。
    【解决方案2】:

    解释帖见:http://yonik.wordpress.com/2008/11/25/solr-faceted-search-performance-improvements/

    新方法通过不反转要分面的索引字段来工作,允许快速查找任何给定文档的字段中的术语。它实际上是一种混合方法——为了节省内存和提高速度,出现在许多文档中的术语(超过 5%)不是未反转的,而是使用传统的集合交集逻辑来获取计数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 2023-01-26
      • 2013-06-21
      相关资源
      最近更新 更多