【问题标题】:Why lucene doesn't require composite index, but relation database does?为什么 lucene 不需要复合索引,而关系数据库需要?
【发布时间】:2011-09-19 19:08:40
【问题描述】:

Lucene 为每个字段单独存储索引。因此,当我们执行查询“fld1:a AND fld2:b”时,我们会在 Termdocs 上迭代第一个术语和第二个术语。这不能更快。在数据库的情况下,fld1 和 fld2 的两个单独索引将运行缓慢,并且只会使用一个。在这种情况下,数据库需要 fld1 和 fld2 的复合键。

我的问题是。如果 Lucene 索引算法与 DB 索引一样快并且不需要不同的列组合,为什么 DB 不能利用 Lucene 索引算法来执行布尔查询?

Lucene Boolean Query 搜索的一些细节: 它使用接口TermDoc。使用boolean skipTo(int)boolean next() 两种方法的主要思想。所以它不依赖于术语顺序(流行或不流行的术语),因为这些方法调用的计数将始终是最不频繁的术语(由于 skipTo 方法)。所以不需要分层复合索引,不会带来任何额外的性能。

TermDocs t1 = searcher.docs(fld1:a);
TermDocs t2 = searcher.docs(fld2:b); 
int doc = -1;
t1.next(); t2.next();
while(t1.doc()!=-1 && t2.doc()!=-1) {
if(t1.doc()<t2.doc()) {
  if(!t1.skipTo(t2.doc)) return;
}
if(t2.doc()<t1.doc()) {
 if(!t2.skipTo(t1.doc)) return;
}
if(t1.doc()==t2.doc()) {
println("found doc:"+t1.doc());
t1.next()
}
}

【问题讨论】:

  • In case of database two separete indexes for fld1 and fld2 will work slow and only one will be used. 这仅适用于 MySQL。 Postgres 没有这个问题。
  • 你确定吗? Db2 也是如此。
  • 好吧,我肯定知道这对 postgres 来说不是问题 =D postgresql.org/docs/8.3/static/indexes-bitmap-scans.html
  • 我不确定,但是 Lucene 不会产生 2 个线程来同时搜索 fld1 和 fld2 吗?从广义上讲,搜索引擎索引仅使用 RAM 资源,而关系数据库假定索引将根据需要从磁盘换入和换出到 RAM。可用 RAM 是对搜索引擎实例(例如,在 prod 中运行)大小的硬性限制,即可以在毫秒内检索到的术语、文档等的数量。虽然数据库有一个额外的层,它暂时为当前查询引入 fld1Index 和 fld2Index(加上系统优化)。祝你好运!
  • @shellter 没有 lucene 不会并行搜索。它利用接口 TermDoc(lucene.apache.org/java/2_3_2/api/org/apache/lucene/index/…)。使用skipTo和next这两种方法的主要思想。所以它不依赖于术语顺序(流行或不流行的术语),因为这些方法调用的计数将始终是最不频繁的术语(由于 skipTo 方法)。所以不需要分层复合索引,不会带来任何额外的性能。

标签: database relational-database indexing lucene


【解决方案1】:

我认为@Frank Farmer 的评论为您提供了大部分答案:RDB 完全有可能使用多个索引,即使它们不是“复合的”。

一个更具体的问题有一个更难的答案:为什么 RDB 不使用 Lucene 的 多索引搜索范式?

回想一下,Lucene 使用带有跳过列表的倒排索引;还记得这些只有在索引非常稀疏且术语数量非常多的情况下才有效。

在您可能执行where a = b 之类的查询的列类型中,可能的bs 数量可能非常少,因此索引会相对密集。因此,使用位图(像 PostgreSQL 一样)并获得位级并行性的加速比将其存储为跳过列表并处理指针追踪更有意义。

我应该注意到,即使 Lucene 在组合过滤器和查询时也使用位图,所以我们可能等效地问为什么 Lucene 不使用 Lucene 的搜索。我的猜测是位图更小,因此更适合内存。

据我所知,这并不是一个巨大的性能提升,因此在一般情况下,您可能无法为位图或跳过列表提出非常有力的论据。但如果我不得不猜测 PostgreSQL 开发人员为何走位图路线,我想会是这样。

【讨论】:

  • 谢谢,我现在明白了为什么 Lucene skipTo 工作得这么快——仅仅因为它是跳过列表。现在问题对我来说似乎很清楚。
猜你喜欢
  • 2016-09-13
  • 2021-03-20
  • 2018-03-18
  • 2023-03-28
  • 2016-01-10
  • 2016-02-20
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多