在Elasticsearch官方文档近实时搜索中,它说
在Elasticsearch中,这个写入和打开新段的过程称为刷新。刷新使自上次刷新以来对索引执行的所有操作都可用于搜索。
默认情况下,Elasticsearch每秒定时刷新索引,…这就是为什么我们说Elasticsearch具有接近实时的搜索:文档的更改不能立即被搜索到,但会在这个时间范围内变得可见。
我感到有点困惑:当服务一个读请求时,为什么不尝试先在memtable中找到文档,然后在磁盘段中,如果这样,我们不需要等待刷新,这使得实时查询成为可能。
非常好的问题,但是要理解为什么Elasticsearch不能从内存文档中提供搜索请求,我们必须稍微深入一点,理解为什么首先创建段以及为什么它们是不可变的。
您可能已经意识到,段是存储搜索索引数据的实际物理文件,段是不可变的,并且这种不可变性提供了很多好处,例如
- 段可以被缓存
- 段可以在多线程环境中使用,而不用担心状态被改变。
现在,由于段被缓存,可以在多线程环境中使用,使用文件系统缓存来提供更快的搜索要容易得多,当然,这意味着有时,你不会有一个新的数据副本,但这是一种权衡,而不是通过memtable迭代,memtable仍在被修改,仍然可以显示旧版本的文档(所以你仍然有一个接近实时的数据)。并且不能缓存,因为它不是不可变的,所以每个搜索线程最终都会在一个总是在运动的数据集上搜索,如果你在搜索时对memtable
应用锁定,它会降低索引速度。
顺便说一句,这是Lucene的设计,Elasticsearch使用它作为一个库,所以它不是真正的Elasticsearch控制它。
底线,即使你在memtable上搜索而不锁定和阻塞更新,你也不能显示实时数据,这将大大降低索引和搜索速度。
希望对你有帮助。