近实时搜索
当文档存储在 Elasticsearch 中时,它会被索引并在 近实时 内(即 1 秒内)完全可搜索。什么是近实时搜索?
Elasticsearch 基于 Java 库 Lucene,Lucene 引入了基于段(per-segment)的搜索概念。段类似于倒排索引,但在 Lucene 中,索引一词意味着“段的集合加上一个提交点”。提交后,一个新的段会被添加到提交点,并且缓冲区会被清空。
位于 Elasticsearch 和磁盘之间的是文件系统缓存。内存中索引缓冲区(图 1)中的文档会被写入一个新的段(图 2)。新的段首先会被写入文件系统缓存(成本较低),稍后才会刷新到磁盘(成本较高)。然而,一旦文件进入缓存,就可以像其他任何文件一样被打开和读取。
Lucene 允许写入并打开新的段,使得它们包含的文档无需执行完全提交即可对搜索可见。这是一个比提交到磁盘轻量得多的过程,并且可以频繁执行而不会降低性能。
在 Elasticsearch 中,这种写入并打开新段的过程称为 刷新(refresh)。刷新会使自上次刷新以来在索引上执行的所有操作都可以被搜索到。您可以通过以下方式控制刷新:
- 等待刷新间隔
- 设置 ?refresh 选项
- 使用 Refresh API 显式完成刷新(
POST _refresh)
默认情况下,Elasticsearch 会定期每秒刷新索引,但仅针对在过去 30 秒内收到过一个或多个搜索请求的索引。这就是为什么我们说 Elasticsearch 拥有 近 实时搜索:文档变更不会立即对搜索可见,但会在这个时间范围内变得可见。