1、PIT是什么?
PIT的全称为Point in time,elastic官方的定义是这样的:
A search request by default executes against the most recent visible data of the target indices, which is called point in time.
我的理解是这样的,一个检索请求执行时,它是在执行检索前最近的这个时刻点索引内所有可见数据范围内执行检索,而不是针对其他时刻点索引内所有可见数据的范围内,关键字是【最近】的时刻点,这个点很重要,需要细细的琢磨、理解。
那么pit要解决什么问题呢?它要解决的是,一个检索请求在不同时间点检索结果出现不一致的问题,正常来说,同样检索条件,应该有相同的输出,但由于索引内数据的变化,比如增加了新数据,则会导致一个请求在不同时刻点检索出现不一样的结果,或者在search_after的请求之间,索引数据发生变化,就会影响search_after的检索结果,那么如何消除时间变量对检索结果的影响呢?这就是pit要解决的问题了。
2、search_after+pit全量检索方案
这个方案,首先利用pit创建时间点,保留索引当前状态,创建pit后,索引内数据的变化不会影响使用该pit检索的结果:
POST /new_tag_202411/_pit?keep_alive=1m
上面的命令会生成一个pid id。
keep_alive参数的含义是:时间点上下文的有效时间,意思是说,索引的数据状态最长保持时间,如果超过这个时间,同一个检索请求的输出就不保证是一样的了。
接下来使用pit构造检索请求:
GET /_search
{
"query": {
"bool": {
"filter": [
{"term":{
"rule_id":1
}}
]
}
},
"sor