Lucene 是如何组织和遍历倒排索引的?
Posted
技术标签:
【中文标题】Lucene 是如何组织和遍历倒排索引的?【英文标题】:How does Lucene organize and walk through the inverted index? 【发布时间】:2016-04-21 10:17:06 【问题描述】:在 SQL 中,索引通常是某种平衡树(指向真实表行的有序节点,以便在O(log n)
中进行搜索)。走过这样一棵树其实就是搜索的过程。
现在 Lucene 使用带有词频的倒排索引:它为每个词存储它在哪些文档中出现的频率。这很容易理解。但这并不能解释如何对此类索引进行搜索。
当然,搜索字符串会被分析并以相同的方式拆分为术语,然后“搜索索引”以查找包含它们的文档 - 但是如何? Lucene 索引本身是否也以某种方式有序和树状组织以使O(log n)
成为可能?或者在搜索时间上走 Lucene 索引实际上是线性的,所以O(n)
?
【问题讨论】:
【参考方案1】:对此没有简单的答案。首先,因为内部格式从发布到发布都得到了改进,其次,因为随着 Lucene 的出现,引入了 4 个可配置编解码器,它们作为逻辑格式和实际物理格式之间的抽象。
索引由分片和副本组成,每一个都是 Lucene 索引本身。 Lucene 索引由多个段组成,而每个段又是一个 Lucene 索引。一个段是只读的,由多个工件组成,可以保存在文件系统或 RAM 中。
来自 Adrien Grand 的What's in a Lucene index 是关于 Lucene 索引组织的出色演示。这个来自 Michael McCandless 的 blog article 和来自 Elastic 的这个 blog article 是关于 Lucene 4 引入的编解码器。
因此查询 Lucene 索引实际上会导致使用特定编解码器并行查询多个段。编解码器可以表示文件系统或 RAM 中的结构,通常针对特定需要进行优化/压缩。内部格式可以是树、Hashmap、有限状态机等任何内容。只要您在搜索中使用通配符(“?”或“*”),就会自动在索引中进行或多或少的深度遍历。
【讨论】:
以上是关于Lucene 是如何组织和遍历倒排索引的?的主要内容,如果未能解决你的问题,请参考以下文章