在Elasticsearch中,索引文档的过程是一个从接收请求到实际存储数据并使其可搜索的完整流程。以下是详细的步骤描述:
-
发送索引请求:
- 客户端通过HTTP REST API向Elasticsearch集群中的任意节点发送一个
PUT
或POST
请求。 - 请求URL通常格式为:
PUT /<index>/_doc/<document_id>
或POST /<index>/_doc
,其中<index>
是索引名称,<document_id>
可以是自定义的文档ID(如果省略,则Elasticsearch会自动分配一个)。
- 客户端通过HTTP REST API向Elasticsearch集群中的任意节点发送一个
-
路由和分片:
- Elasticsearch根据文档ID和预定义的哈希函数确定文档应该被路由到哪个主分片上。每个索引都有多个分片,以便进行水平扩展和分布式处理。
-
解析请求体:
- 请求体包含待索引文档的内容,通常是JSON格式的数据。Elasticsearch接收到请求后,会解析这个JSON对象,并将其字段名与索引映射(mapping)匹配起来。
-
分析阶段:
- 对于每个字段,Elasticsearch会依据该字段在映射中的分析器配置对其进行分析。分析过程可能包括但不限于:
- 文本字段的分词(Tokenization)
- 停用词过滤
- 词汇单元转换(如转小写、标准化等)
- 执行特定的过滤器
- 对于每个字段,Elasticsearch会依据该字段在映射中的分析器配置对其进行分析。分析过程可能包括但不限于:
-
索引创建:
- 经过分析后的每个字段会被转化为倒排索引结构,这是Elasticsearch快速查询的基础。对于非文本字段,也会按照各自的类型进行合适的处理和存储。
-
事务日志记录:
- 在将文档添加到索引之前,操作会先写入事务日志(Translog),确保即使在节点崩溃时也能恢复未持久化的更改。
-
实际索引:
- 将处理过的文档内容存储到目标分片中,同时复制到相关的副本分片上以提供高可用性和容错性。
-
刷新(Refresh)机制:
- 默认情况下,Elasticsearch会定期执行刷新操作,使得新索引或更新的文档能够尽快变得可见,支持近实时搜索。但请注意,这并不意味着强一致性,而是最终一致性模型。
-
段合并(Segment Merge):
- 随着索引操作持续进行,Elasticsearch后台会执行段合并操作,将多个小的段合并成大的段,从而优化磁盘空间使用和搜索性能。
通过以上步骤,Elasticsearch成功地将文档索引至指定的索引中,使之可以被用户检索、排序和聚合。