近实时搜索

编辑

当文档存储在 Elasticsearch 中时,它会在近实时内(即 1 秒内)被索引并完全可搜索。什么定义了近实时搜索?

Lucene 是 Elasticsearch 基于的 Java 库,它引入了按段搜索的概念。类似于倒排索引,但 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 具有实时搜索的原因:文档更改不会立即对搜索可见,但会在这个时间范围内变得可见。