![](/img/trans.png)
[英]How much space and processing will be optimized in Lucene index by storing a field as Byte instead of String for billions of documents
[英]How does lucene index documents?
我读了一些有关Lucene的文件; 我也通过此链接( http://lucene.sourceforge.net/talks/pisa )阅读了文档。
我真的不了解Lucene如何为文档建立索引,也不了解Lucene用于索引的算法是什么?
在上面的链接上,它说Lucene使用此算法进行索引:
- 增量算法:
- 维护一堆细分指数
- 为每个传入文档创建索引
- 将新索引推入堆栈
- 令b = 10为合并因子; M = 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树算法或类似索引的任何其他算法-还是有特定的算法?
这里有一篇相当不错的文章: https : //web.archive.org/web/20130904073403/http : //www.ibm.com/developerworks/library/wa-lucene/
编辑12/2014:由于原始文件已被删除,因此已更新至存档版本,可能最新最好的替代方法是http://lucene.apache.org/core/3_6_2/fileformats.html
http://lucene.apache.org/core/4_10_2/core/org/apache/lucene/codecs/lucene410/package-summary.html#package_description中有一个更新的版本,但其中包含的信息似乎较少。比年长的一个
简而言之,当Lucene为文档编制索引时,它将其分为许多术语。 然后,它将术语存储在索引文件中,其中每个术语与包含该术语的文档相关联。 您可能认为它有点像哈希表。
术语是使用分析器生成的,该分析器将每个单词的词根都提取出来。 最受欢迎的英语词干提取算法是Porter词干提取算法: http : //tartarus.org/~martin/PorterStemmer/
发出查询时,将通过用于构建索引的同一分析器对它进行处理,然后使用该分析器在索引中查找匹配项。 这提供了与查询匹配的文档列表。
简而言之,Lucene使用磁盘上的 Skip-Lists构建了一个反向索引,然后使用有限状态转换器 (FST)将索引项的映射加载到内存中 。 但是请注意,Lucene 不会(必需)将所有索引项加载到RAM ,正如Lucene的索引系统作者本人Michael McCandless所描述的那样。 请注意,通过使用“跳过列表”,可以将索引从一个命中遍历到另一个命中,从而使诸如set (特别是范围查询)之类的事情成为可能(非常类似于B-Trees)。 Wikipedia关于索引“跳过列表”的条目也解释了为什么Lucene的“跳过列表”实现被称为多级“跳过列表”-从本质上讲,使O(log n)
查找成为可能(再次类似于B树)。
因此,一旦从文档建立了基于Skip-List数据结构的倒排(项)索引,该索引就会存储在磁盘上。 然后,在由Morfologick 启发的FST实现中,Lucene将这些术语(如已经说过的:可能只有其中的一部分)加载到有限状态传感器中。
Michael McCandless(也)做了出色而简洁的工作, 解释了Lucene如何以及为什么使用(最小无环)FST来索引Lucene存储在内存中的术语,本质上是作为SortedMap<ByteSequence,SomeOutput>
,并给出了一个基本思路FST的工作方式(即FST如何压缩字节序列[即索引项],以使使用此映射的内存增长成亚线性)。 他还指出了描述 Lucene使用的特定FST算法的论文 。
对于那些好奇为什么Lucene使用跳过列表,而大多数数据库使用(B +)和/或(B)-树的人,请查看有关此问题的正确的 SO答案 (跳过列表与B-树)。 该答案给出了一个很好的,深刻的解释-本质上,并没有太多地使索引的并发更新“更令人满意”(因为您可以决定不立即重新平衡B-Tree,从而获得与B-Tree相同的并发性能。跳过列表),但是, 跳过列表使您不必进行 B树所需的 (延迟的或不平衡的) 平衡操作 (实际上)(实际上,如答案所示/引用所示,几乎没有B树和[多级]跳过列表之间的性能差异(如果两者均“正确完成”。)
看来您的问题更多是关于索引合并,而不是索引本身。
如果您忽略低级详细信息,索引编制过程将非常简单。 Lucene从文档中形成所谓的“倒排索引”。 因此,如果输入文本为“ To be or not be be”且id = 1的文档,则倒排索引如下所示:
[to] → 1
[be] → 1
[or] → 1
[not] → 1
基本上就是这样-从单词到包含给定单词的文档列表的索引。 该索引(单词)的每一行称为发布列表。 然后,该索引将保留在长期存储中。
实际上,事情会更加复杂:
还有更多的并发症,对于基本的了解来说并不是那么重要。
重要的是要了解,Lucene索引仅附加 。 在某个时间点,应用程序决定提交(发布)索引中的所有更改。 Lucene使用索引完成所有服务操作并将其关闭,因此可用于搜索。 提交后的索引基本上是不变的。 该索引(或索引部分)称为segment 。 当Lucene执行搜索查询时,它会搜索所有可用段。
因此出现了一个问题–我们如何更改已建立索引的文档 ?
新文档或已建立索引文档的新版本在新段中建立索引,而旧版本在先前段中无效(使用所谓的终止列表) 。 杀死列表是提交索引中唯一可以更改的部分。 您可能会猜到,索引效率会随着时间下降,因为旧索引可能包含大部分已删除的文档。
这就是合并的来源。合并–是合并多个索引以提高整体索引效率的过程。 合并期间基本上发生的是将活动文档复制到新段,并将旧段完全删除。
使用这种简单的过程,Lucene可以在搜索性能方面将索引保持良好的状态。
希望会有所帮助。
它是反向索引 ,但未指定其使用的结构。 lucene中的索引格式具有完整的信息。
从“文件扩展名摘要”开始。
您首先会注意到,它讨论了各种不同的索引。 据我所知,严格意义上讲,这些都不使用B树 ,但是有相似之处-上面的结构确实类似于树。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.