疲劳是最舒适的枕头,努力工作吧。

关于ES的refresh的一些认识2

Elasticsearch | 作者 Charele | 发布于2024年03月20日 | 阅读数:2099

首先上一个图(图搞得有点丑陋)
这就是ES里面的refresh机制的流程
1111.PNG

 
已邀请:

Charele - Cisco4321

赞同来自:

ES里面有两个刷新器,外部的和内部的
 
当你执行refresh操作时(手动或自动),
它是外部刷新器来执行,但外部的并不自己做事,叫内部的去刷新。
内部的请求发到Lucene,(文档有变化)Lucene会生成一个新的NRT Reader,
 
这个新生成的dr会同时赋给dr1, dr2。
(红线所标的流程)
 
你的查询用的就是外部刷新器里的dr1, 所以你就可以查询到新的结果了。
 
但如果你执行的是flush操作呢,也会和上面一样的操作。
只是最新结果只返回给dr2, 并不返回给dr1。
(蓝线所标)
 
所以当你的索引是"refresh_interval": -1,
你插入文档时并执行flush后,你是看不到结果的。
其实ES已经取得了最新结果,赋给了dr2,但并没有赋给dr1。所以你是查不到数据的
 
以前看到有个道友说他ES6执行flush后能看到结果,
我想怎么可能。特地下载了一个ES6看了一下,
的确是的,老版里面只有一个刷新器(不分内外) 
 

Charele - Cisco4321

赞同来自:

2222.PNG

 
这是ES flush操作的代码,红色的是正事,
归档日志,进行Lucene提交啥的。
 
蓝色的,顺带用内部刷新器刷新了一下。
这些ES的流程并不复杂,很容易理解。
 
 
下面说说,当你refresh时,里面发生了什么。
理解上认为,refresh = Lucene flush
 但refresh跟显示去调用Lucene的flush()方法还是有区别的,并不能相等

Charele - Cisco4321

赞同来自:

1111.PNG

 
抛开那些无关紧要的代码,你会来到这个,这个getReader()方法,
就是ES refresh执行的实质所在,它生成一个最新的NRT reader给ES.
 
首先一个问题是这两个参数applyAllDeletes, writeAllDeletes究竟是什么意思,
apply所有删除?写所有删除?
当你用ES时,它固定的是 (true, false)
除了不能是(false, true)(下面会报错)
 
那如果我是其它组合,(true, true),或者(false, false)对于结果会有什么不一样吗?
 
 
 
 
 

要回复问题请先登录注册