gpt4 book ai didi

database - 为什么lucene不需要复合索引,而关系数据库需要?

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:41 27 4
gpt4 key购买 nike

Lucene 分别为每个字段存储索引。因此,当我们执行查询“fld1:a AND fld2:b”时,我们会针对第一个术语和第二个术语迭代 Termdocs。这再快不过了。在数据库的情况下,fld1 和 fld2 的两个单独索引将工作缓慢,并且将只使用一个。在那种情况下,DB 需要 fld1 和 fld2 的组合键。

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

Lucene Boolean Query 搜索的一些细节:它利用接口(interface) 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()
}
}

最佳答案

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

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

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

在您可能会执行类似 where a = b 的查询的列类型中,可能的 b 数量可能非常小,因此索引会比较密集。因此,使用位图(就像 PostgreSQL 所做的那样)并获得位级并行性的加速比将其存储为跳跃列表并处理指针追逐更有意义。

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

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

关于database - 为什么lucene不需要复合索引,而关系数据库需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6430375/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com