Lucene中的segments是什么?

49

Lucene中的段是什么?

段的好处是什么?

3个回答

71

Lucene索引被分成小的块称为段,每个段都是自己的索引。Lucene按顺序搜索所有这些段。

当打开新的写入器并提交或关闭写入器时,会创建一个新的段。

使用此系统的优点是一旦创建了段的文件就不必修改段的文件。当您在索引中添加新文档时,它们将添加到下一个段中。以前的段永远不会被修改。

删除文档是通过在文件中指示要删除的段的文档来完成的,但实际上文档始终保留在段中。在Lucene中,文档并没有真正更新。发生的情况是,将文档的先前版本标记为已删除,并将文档的新版本添加到当前段中。这最大程度地减少了在更改时不断修改其内容而破坏索引的机会,并且允许轻松备份和同步索引在不同的机器之间。

然而,在某些时候,Lucene可能会决定合并一些段。此操作也可以通过优化来触发。


2
每个单独的段文件中都有术语词典吗?如果两个段落都有“搜索,我”的单词,那么它们会有两个字典吗?这将使每个段变得如此庞大,以存储重复的术语吗? - TomSawyer

27

一个segment非常简单地是索引的一部分。这个想法是,你可以通过创建一个仅包含新文档的新segment来将文档添加到当前正在服务的索引中。这样,你就不必经常重建整个索引以添加新文档,从而避免了昂贵的麻烦。


8

其他人已经回答了分段的好处。我将包括一个Lucene索引的ASCII图表。

Lucene段

Lucene段是索引的一部分。每个段由几个索引文件组成。如果您查看其中任何一个文件,您会发现它保存了1个或多个Lucene文档

+- Index 5 ------------------------------------------+
|                                                    |
|  +- Segment _0 ---------------------------------+  |
|  |                                              |  |
|  |  +- file 1 -------------------------------+  |  |
|  |  |                                        |  |  |
|  |  | +- L.Doc1-+  +- L.Doc2-+  +- L.Doc3-+  |  |  |
|  |  | |         |  |         |  |         |  |  |  |
|  |  | | field 1 |  | field 1 |  | field 1 |  |  |  |
|  |  | | field 2 |  | field 2 |  | field 2 |  |  |  |
|  |  | | field 3 |  | field 3 |  | field 3 |  |  |  |
|  |  | |         |  |         |  |         |  |  |  |
|  |  | +---------+  +---------+  +---------+  |  |  |
|  |  |                                        |  |  |
|  |  +----------------------------------------+  |  |
|  |                                              |  |
|  |                                              |  |
|  |  +- file 2 -------------------------------+  |  |
|  |  |                                        |  |  |
|  |  | +- L.Doc4-+  +- L.Doc5-+  +- L.Doc6-+  |  |  |
|  |  | |         |  |         |  |         |  |  |  |
|  |  | | field 1 |  | field 1 |  | field 1 |  |  |  |
|  |  | | field 2 |  | field 2 |  | field 2 |  |  |  |
|  |  | | field 3 |  | field 3 |  | field 3 |  |  |  |
|  |  | |         |  |         |  |         |  |  |  |
|  |  | +---------+  +---------+  +---------+  |  |  |
|  |  |                                        |  |  |
|  |  +----------------------------------------+  |  |
|  |                                              |  |
|  +----------------------------------------------+  |
|                                                    |
|  +- Segment _1 (optional) ----------------------+  |
|  |                                              |  |
|  +----------------------------------------------+  |
+----------------------------------------------------+

参考文献

《Lucene实战 第二版》- 2010年7月 - Manning出版社


2
该段不包含文档本身,它只是倒排索引的一部分,其中包含对文档本身(如ID)的引用 - BornToCode
你好BornToCode... 为了回答问题的两个部分,我使用了“文档”这个词,它涵盖了两个含义——字段序列和源文档。我只留下了ASCII图表,它只使用了“文档”的一个含义——Lucene文档,它是一个字段序列(https://lucene.apache.org/core/2_9_4/fileformats.html#Segments)。希望这样更清楚了? - notapatch
这样更好,但如果我没有看到你的评论,我仍然会感到困惑。我认为主要要表明的是,在这些段落中,包含了构成倒排索引的术语和包含这些术语的文档的参考ID(如果我理解正确的话)。另外,你从哪里得出“Lucene文档”的概念的? - BornToCode
1
回复:你从哪里得到了“Lucene文档”的概念?- 我从Apache的Lucene文档中的定义部分得到的...它说:“索引包含一系列文档。文档是字段序列。” https://lucene.apache.org/core/2_9_4/fileformats.html#Segments - notapatch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接