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