Lucene中的段是什么?
段的好处是什么?
Lucene索引被分成小的块称为段,每个段都是自己的索引。Lucene按顺序搜索所有这些段。
当打开新的写入器并提交或关闭写入器时,会创建一个新的段。
使用此系统的优点是一旦创建了段的文件就不必修改段的文件。当您在索引中添加新文档时,它们将添加到下一个段中。以前的段永远不会被修改。
删除文档是通过在文件中指示要删除的段的文档来完成的,但实际上文档始终保留在段中。在Lucene中,文档并没有真正更新。发生的情况是,将文档的先前版本标记为已删除,并将文档的新版本添加到当前段中。这最大程度地减少了在更改时不断修改其内容而破坏索引的机会,并且允许轻松备份和同步索引在不同的机器之间。
然而,在某些时候,Lucene可能会决定合并一些段。此操作也可以通过优化来触发。
一个segment非常简单地是索引的一部分。这个想法是,你可以通过创建一个仅包含新文档的新segment来将文档添加到当前正在服务的索引中。这样,你就不必经常重建整个索引以添加新文档,从而避免了昂贵的麻烦。
其他人已经回答了分段的好处。我将包括一个Lucene索引的ASCII图表。
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) ----------------------+ |
| | | |
| +----------------------------------------------+ |
+----------------------------------------------------+