目录
- 一、近实时搜索的概述
- 1.1、按段(per-segment)搜索
- 1.2、更轻量的方式搜索
- 二、为什么Elasticsearch是 近 实时搜索
- 三、如何解决索引了一个文档然后却没有搜到
- 四、哪种情况不需要每秒刷新
- 4.1、使用 Elasticsearch 索引大量的日志文件
- 4.2、使用 Elasticsearch建立一个大的新索引时
一、近实时搜索的概述
1.1、按段(per-segment)搜索
- 随着按段(per-segment)搜索的发展,一个新的文档从索引到可被搜索在几分钟之内即可被检索,但这样还是不够快。因为磁盘成为了瓶颈。
- 提交(Commiting)一个新的段到磁盘需要一个 fsync 来确保段被物理性地写入磁盘,在断电的时候就不会丢失数据。 但是 fsync 操作代价很大; 如果每次索引一个文档都去执行一次的话会造成很大的性能问题。
1.2、更轻量的方式搜索
-
在 Elasticsearch 和磁盘之间是文件系统缓存,新段会被先写入到文件系统缓存,稍后再被刷新到磁盘。
-
不过只要文件已经在缓存中,就可以像其它文件一样被打开和读取了。使其包含的文档在未进行一次完整提交时便对搜索可见,并且在不影响性能的前提下可以被频繁地执行。
二、为什么Elasticsearch是 近 实时搜索
- 在 Elasticsearch 中,写入和打开一个新段的轻量的过程叫做 refresh 。 默认情况下每个分片会每秒自动刷新一次。
- 文档的变化并不是立即对搜索可见,但会在一秒之内变为可见。
三、如何解决索引了一个文档然后却没有搜到
- 使用 refresh API 执行一次手动刷新: /users/_refresh。
- 尽管刷新是比提交轻量很多的操作,它还是会有性能开销。当写测试的时候, 手动刷新很有用,但是不要在生产环境下每次索引一个文档都去手动刷新。
四、哪种情况不需要每秒刷新
4.1、使用 Elasticsearch 索引大量的日志文件
-
可能只想优化索引速度而不是近实时搜索, 可以通过设置 refresh_interval , 降低每个索引的刷新频率。
{ "settings": { "refresh_interval": "30s" } }
4.2、使用 Elasticsearch建立一个大的新索引时
-
refresh_interval 可以在既存索引上进行动态更新。
-
在生产环境中,当你正在建立一个大的新索引时,可以先关闭自动刷新。
# 关闭自动刷新 PUT /users/_settings { "refresh_interval": -1 }
-
然后,待开始使用该索引时,再设置自动刷新。
# 每一秒刷新 PUT /users/_settings { "refresh_interval": "1s" }