在 Elasticsearch 中,一个索引由多个**分片(Shard)**组成,而每个分片又由多个**段(Segment)**构成。段是索引的最小搜索单元,是不可变的,一旦创建,其内容就不会再改变。以下是段(Segment)的组成部分:
1. **倒排索引(Inverted Index)**:这是 Elasticsearch 用来实现快速搜索的核心数据结构。它包括一个词项字典,记录了每个词项在文档中出现的位置和频率。
2. **正排索引(Forward Index)**:与倒排索引相对应,正排索引存储了文档的内容和元数据,以及词项在文档中的位置。
3. **文档存储(Document Store)**:存储了文档的原始数据,可以用于返回搜索结果。
4. **删除标记(Delete Markers)**:记录了哪些文档被标记为删除,但实际数据仍然保留在段中,直到段被合并。
5. **字段统计(Field Statistics)**:记录了字段级别的统计信息,如词项频率等。
6. **词汇表(Term Dictionary)**:包含了索引中所有唯一词项的列表。
7. **词项位置(Term Positions)**:记录了词项在文档中的位置信息。
8. **词项频率(Term Frequencies)**:记录了词项在文档中出现的频率。
9. **归一化值(Norms)**:用于存储文档的字段长度的归一化信息,用于影响搜索的相关性评分。
10. **存储信息(Stored Fields)**:存储了文档中需要被检索但不需要被索引的字段信息。
11. **压缩数据**:为了节省存储空间,段中的数据通常会被压缩存储。
12. **段的元数据**:包含了段的版本信息、创建时间等元数据信息。
当文档被索引或更新时,Elasticsearch 会创建新的段。随着时间的推移,段的数量可能会增加,这会影响搜索性能。因此,Elasticsearch 会定期进行**段合并(Segment Merging)**操作,将多个小的段合并成大的段,以优化搜索性能和存储效率。