9

语境

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

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

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

问题

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

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

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

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

4

2 回答 2

6

刻面

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

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

    select facet, count(*) from field_cache where docId in query_results group by facet

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

多词搜索

这就是 Lucene 大放异彩的地方。为什么 Lucene 的方法这么好,在这里发布太长了,但我可以推荐这篇关于 Lucene Performance 的帖子,或者其中链接的论文。

于 2011-04-06T15:31:38.007 回答
3

可以在以下位置找到解释性帖子:http: //yonik.wordpress.com/2008/11/25/solr-faceted-search-performance-improvements/

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

于 2011-04-07T12:09:39.427 回答