如果将新文档索引到Elasticsearch索引,则可在索引操作后1秒钟左右搜索新文档。但是,可以通过调用_flush或_refresh对索引进行操作来强制使该文档可立即搜索。这两个操作之间有什么区别- 结果似乎对他们来说是相同的,可以立即搜索文档。
_flush
_refresh
这些操作中的每一项到底是什么?
ES文档似乎并未深入解决此问题。
您得到的答案是正确的,但我认为值得详细说明。
刷新有效地调用了Lucene索引读取器上的reopen,以便可以搜索的数据的时间点快照得到更新。该lucene功能是lucene近实时api的一部分。
一个elasticsearch刷新使可用于搜索文档,但它并不一定使他们被写入到磁盘到永久存储,因为它不叫FSYNC,因此不保证耐用性。使您的数据持久的原因是Lucene提交,这更加昂贵。
虽然您可以每秒调用一次lucene reopen,但是您不能对lucene commit进行相同的操作。
通过lucene,您可以通过经常调用reopen来近实时地搜索新文档,但是您仍然需要调用commit来确保将数据写入磁盘并进行fsync,因此很安全。
Elasticsearch通过为每个分片(有效地是Lucene索引)添加一个事务日志来解决此“问题”,在该日志中存储了尚未提交的写操作。事务日志是同步的且安全的,因此即使在尚未提交的文档中,您也可以在任何时间获得持久性。您可以几乎每秒实时搜索文档,因为刷新每秒自动进行一次,并且还可以确保如果发生问题,可以重播事务日志以恢复最终丢失的文档。关于事务日志的好处是它可以在内部用于其他用途,例如,通过id提供实时获取。
一个elasticsearch冲洗有效地触发了Lucene的承诺,并清空还事务日志,因为一旦数据在Lucene的水平承诺,耐久性可以通过Lucene的自身保障。冲洗也可以通过api公开,并且可以进行调整,尽管通常这不是必需的。刷新会自动发生,具体取决于向事务日志中添加了多少操作,它们的大小以及上次刷新的时间。