原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/near-real-time.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/near-real-time.html

近实时搜索 (Near real-time search)

文档和索引 概述表明,当一个文档存储到 Elasticsearch 中时,它会被索引,并在 1 秒钟内几乎实时地完全可搜索。 是什么定义了近实时搜索?

Elasticsearch 所基于的 Java 库 Lucene 引入了按 段(segment) 搜索的概念。 一个 segment(段) 类似于一个倒排索引,但是单词 index 在Lucene 中的意思是“一个段的集合加上一个提交点”。 在提交之后,一个新的段被添加到提交点,并且清空缓冲区。

位于 Elasticsearch 和磁盘之间的是文件系统缓存。 内存索引缓冲区中的文档(图 1)被写入一个新的段 (图 2)。 新的段首先被写入文件系统缓存(代价很低),然后才被 刷写(flush) 到磁盘(代价很高)。 但是,文件进入缓存后,就可以像其他文件一样打开和读取。

A Lucene index with new documents in the in-memory buffer
图1、内存缓冲区中包含新文档的 Lucene 索引

Lucene 允许写入和打开新的段,使得它们包含的文档在搜索时可见,而无需执行一个完整的提交。 这是一个比提交到磁盘轻得多的过程,并且可以经常执行而不会降低性能。

The buffer contents are written to a segment, which is searchable, but is not yet committed
图2、缓冲区内容被写入一个可搜索的段,但它尚未提交

在 Elasticsearch 中,写入和打开一个新段的过程称为 refresh(刷新)。 refresh 使自上次刷新以来对索引执行的所有操作都可被搜索。 可以通过以下方式控制 refresh:

  • 等待刷新间隔
  • 设置 ?refresh 选项
  • 使用 refresh API 来显式的完成一个 refresh (POST _refresh)

默认情况下,Elasticsearch 每秒定期 refresh 索引,但只针对在过去 30 秒内收到一个或更多搜索请求的索引。 这就是为什么我们说 Elasticsearch 具有 实时的搜索:文档更改不会立即在搜索中可见,但会在这个时间段内变得可见。