Elasticsearch 索引底层控制详解
1. 近实时搜索与索引更新机制
在理想的搜索解决方案中,新数据索引后应立即可用于搜索。但实际并非总是如此。例如,我们使用以下命令向新创建的索引中索引一个示例文档:
curl -XPOST localhost:9200/test/test/1 -d '{ "title": "test" }'接着,我们替换这个文档并立即尝试搜索它:
curl -XPOST localhost:9200/test/test/1 -d '{ "title": "test2" }' ; curl -XGET 'localhost:9200/test/test/_search?pretty'搜索结果可能仍返回第一个文档,而非更新后的文档。这是因为在索引过程中,新文档被写入段(segments),而 Apache Lucene 需要通过提交(committing)操作将新段添加到用于搜索的段集合中。提交操作确保所有更改或无更改会影响索引,若发生故障,索引仍能保持一致状态。
然而,提交操作并不足以使数据可搜索。Lucene 使用名为 Searcher 的抽象类访问索引,该类需要刷新(refresh)。默认情况下,Elasticsearch 为提高性能会推迟刷新操作,搜索器每秒刷新一次。若需要更频繁刷新,可使用 Elasticsearch API 强制刷新,例如:
curl -