我读了一些关于Lucene的文档;我还阅读了此链接中的文档
(http://lucene.sourceforge.net/talks/pisa http://lucene.sourceforge.net/talks/pisa).
我不太明白Lucene是如何索引文档的,也不明白Lucene使用哪些算法来索引?
在上面的链接中,它说 Lucene 使用此算法进行索引:
- incremental algorithm:
- 维护一个段索引堆栈
- 为每个传入文档创建索引
- 将新索引压入堆栈
- 设 b=10 为合并因子;中号=8
for (size = 1; size < M; size *= b) {
if (there are b indexes with size docs on top of the stack) {
pop them off the stack;
merge them into a single index;
push the merged index onto the stack;
} else {
break;
}
}
该算法如何提供优化的索引?
Lucene使用B树算法还是任何其他类似的算法来建立索引
- 或者它有特定的算法吗?
简而言之,Lucene 使用以下方式构建倒排索引:跳过列表 https://lucene.apache.org/core/6_6_0/core/org/apache/lucene/codecs/MultiLevelSkipListWriter.html on disk,然后加载索引项的映射进入记忆用一个有限状态换能器 https://lucene.apache.org/core/6_6_0/core/org/apache/lucene/util/fst/Builder.html(FST)。但请注意,Lucene不(必须)将所有索引项加载到 RAM http://blog.mikemccandless.com/2010/07/lucenes-ram-usage-for-searching.html正如 Lucene 索引系统的作者 Michael McCandless 本人所描述的那样。请注意,通过使用 Skip-Lists,索引可以从一个命中遍历到另一个命中,从而使得诸如set并且,特别是,范围查询可能(很像 B 树)。还有关于索引跳跃列表的维基百科条目 https://en.wikipedia.org/wiki/Skip_list#Indexable_skiplist还解释了为什么 Lucene 的 Skip-List 实现被称为多层次跳过列表 - 本质上,使O(log n)
可以进行查找(同样,很像 B 树)。
因此,一旦倒排(术语)索引 - 基于跳表数据结构 https://en.wikipedia.org/wiki/Skip_list- 从文档构建,索引存储在磁盘上。 Lucene 然后将这些术语加载(如前所述:可能只是其中一些)到有限状态换能器 https://en.wikipedia.org/wiki/Finite-state_transducer,在 FST 实现中松散的灵感 https://lucene.apache.org/core/6_6_0/core/org/apache/lucene/util/fst/FST.html by 形态学 https://github.com/morfologik/morfologik-stemming.
迈克尔·麦坎德利斯(Michael McCandless)(也)在以下方面做得非常好和简洁解释 Lucene 如何以及为何使用(最小非循环)FST http://blog.mikemccandless.com/2010/12/using-finite-state-transducers-in.html为 Lucene 存储在内存中的术语建立索引,本质上是作为SortedMap<ByteSequence,SomeOutput>
,并给出了 FST 如何工作的基本概念(即 FST 如何压缩字节序列 [即索引项] 以使该映射的内存使用量呈亚线性增长)。他指出描述特定 FST 算法的论文 http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.24.3698Lucene 也使用。
对于那些好奇为什么 Lucene 使用 Skip-Lists 而大多数数据库使用 (B+)- 和/或 (B)-Trees 的人,请看一下the right所以答案 https://stackoverflow.com/a/28270537/1847419关于这个问题(Skip-Lists vs. B-Trees)。这个答案给出了一个非常好的、深入的解释——本质上,not这么多使得索引的并发更新“更容易接受”(因为您可以决定不立即重新平衡 B 树,从而获得与 Skip-List 相同的并发性能),而是,跳过列表使您无需处理(延迟或不延迟)平衡操作(最终)B 树需要(事实上,正如答案所示/参考,如果其中任何一个“做得正确”,B 树和[多级]跳过列表之间的性能差异可能很小。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)