3

我一直在使用 Elastic Search(由下面的 Lucene 提供支持),它很棒。无论我向它扔什么,它都会快速燃烧。

我想知道为什么它现在很快。我理解它使用倒排索引,我部分理解基于我发现的几篇文章和一些很好的 youtube 视频解释它的内容,但为什么这比 Mysql 或 Mongo 中的二叉树快得多? 我知道这有点像苹果和橘子的比较,但我还没有找到任何关于倒排索引与二叉树索引如何工作的真正好的解释(比如并排) 。

到目前为止,我唯一收集到的是,基于索引时间,倒排索引总是更快,因为它不必重新平衡树的叶子(分形索引也是如此)。

4

1 回答 1

7

这都是关于权衡的。

Lucene 的索引与 B-Tree非常不同,并且基于一次写入的段。对于每个段,都有一个术语字典发布列表。查找一个术语需要阅读术语词典中有关该术语的一些信息,然后跳转到其发布列表的开头,您将能够在其中按顺序阅读与该术语匹配的文档列表。术语字典中的查找基于二进制搜索的一种变体,以便能够有效地运行范围查询。

每次添加文档时,都会创建一个新段(这就是 Lucene 在批量更新方面要好得多的原因),当段数达到可配置的阈值(称为合并因子)时,一些段被合并在一起(基于合并策略)。

这种设计允许 Lucene 高效地运行许多查询,但另一方面,Lucene 仍然不是很擅长原子单文档更新(因为每次提交都需要刷新一个新段并且因为您需要重新索引整个文档,所以没有不管你的修改有多大)。正在进行与个别领域更新相关的工作,但这仍然是实验性的。

于 2012-09-03T10:37:54.147 回答