繁体   English   中英

lucene如何索引文件?

[英]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索引仅附加 在某个时间点,应用程序决定提交(发布)索引中的所有更改。 Lucene使用索引完成所有服务操作并将其关闭,因此可用于搜索。 提交后的索引基本上是不变的。 该索引(或索引部分)称为segment 当Lucene执行搜索查询时,它会搜索所有可用段。

因此出现了一个问题–我们如何更改已建立索引的文档

新文档或已建立索引文档的新版本在新段中建立索引,而旧版本在先前段中无效(使用所谓的终止列表) 杀死列表是提交索引中唯一可以更改的部分。 您可能会猜到,索引效率会随着时间下降,因为旧索引可能包含大部分已删除的文档。

这就是合并的来源。合并–是合并多个索引以提高整体索引效率的过程。 合并期间基本上发生的是将活动文档复制到新段,并将旧段完全删除。

使用这种简单的过程,Lucene可以在搜索性能方面将索引保持良好的状态。

希望会有所帮助。

它是反向索引 ,但未指定其使用的结构。 lucene中的索引格式具有完整的信息。
从“文件扩展名摘要”开始。

您首先会注意到,它讨论了各种不同的索引。 据我所知,严格意义上讲,这些都不使用B树 ,但是有相似之处-上面的结构确实类似于树。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM