在Elasticsearch中,索引文档的过程涉及多个步骤,从接收数据、分析、存储到能够被搜索和查询。以下是详细描述这个过程:
-
接收数据:
- 客户端通过HTTP/RESTful API或者使用Transport Client(已废弃)或Java High Level REST Client向Elasticsearch集群发送一个索引请求。
- 请求通常采用
PUT
或POST
方法对指定索引下的文档进行操作,如:PUT /<index>/_doc/<document_id> { "field1": "value1", "field2": "value2", ... }
- 如果不指定
document_id
,Elasticsearch会自动生成一个唯一ID。
-
路由与分片:
- Elasticsearch根据文档的_id和预先定义好的索引分片设置,确定文档应该被路由到哪个主分片上。
-
索引创建:
- 如果目标索引尚未存在,Elasticsearch会根据接收到的请求内容以及默认或自定义的映射(mapping)来创建索引。
-
分析阶段:
- 对于每个字段,Elasticsearch会依据该字段在映射中的分析器(analyzer)配置对字段值进行处理。
- 分析过程可能包括字符过滤、分词(tokenizer)、词汇单元过滤等步骤,将文本转换为可搜索的术语列表。
-
索引写入:
- 经过分析后的文档被写入到目标主分片,并复制到相关的副本分片上以实现冗余和高可用性。
- 在这个过程中,Lucene索引引擎在底层负责实际的索引构建工作。
-
事务日志和刷新(Refresh):
- 写入操作首先会被记录到事务日志(translog),确保即使在节点失败的情况下也能恢复未持久化的更改。
- 默认情况下,Elasticsearch每秒自动刷新一次索引,这使得新索引的文档变得可见并可供搜索(近实时搜索特性),但请注意,这并非强一致性保证,而是最终一致性模型。
-
段合并:
- 随着索引操作的持续进行,Elasticsearch后台会定期执行段合并(segment merging),优化索引结构,减少碎片文件的数量,提高查询性能。
总结来说,索引文档是一个涉及到网络通信、分布式协调、数据解析、索引构建、日志管理及后台维护等多个层面的复杂流程,确保数据高效地存储并能快速检索。