近实时搜索编辑

文档和索引概述指出,当文档存储在 Elasticsearch 中时,它会被索引并在*近实时*(1 秒内)完全可搜索。 什么是近实时搜索?

Elasticsearch 所基于的 Java 库 Lucene 引入了按段搜索的概念。*段*类似于倒排索引,但 Lucene 中的*索引*一词指的是“段的集合加上提交点”。 提交后,新段会被添加到提交点,并且缓冲区会被清除。

位于 Elasticsearch 和磁盘之间的是文件系统缓存。 内存索引缓冲区(图 6)中的文档会被写入新段(图 7)。 新段首先被写入文件系统缓存(成本低廉),之后才会被刷新到磁盘(成本高昂)。 但是,文件进入缓存后,就可以像打开和读取任何其他文件一样打开和读取它。

A Lucene index with new documents in the in-memory buffer
图 6. 内存缓冲区中有新文档的 Lucene 索引

Lucene 允许写入和打开新段,从而使它们包含的文档对搜索可见,而无需执行完整提交。 这比提交到磁盘要轻量得多,并且可以频繁执行而不会降低性能。

The buffer contents are written to a segment, which is searchable, but is not yet committed
图 7. 缓冲区内容被写入段,该段可搜索,但尚未提交

在 Elasticsearch 中,写入和打开新段的过程称为*刷新*。 刷新操作会使自上次刷新以来对索引执行的所有操作都可用于搜索。 您可以通过以下方式控制刷新:

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

默认情况下,Elasticsearch 每秒定期刷新索引,但仅刷新过去 30 秒内收到过一个或多个搜索请求的索引。 这就是我们说 Elasticsearch 具有*近*实时搜索的原因:文档更改不会立即对搜索可见,但会在此时间范围内变得可见。