加载中

近实时搜索

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

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

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

A Lucene index with new documents in the in-memory buffer

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

The buffer contents are written to a segment, which is searchable, but is not yet committed

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

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

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

© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.