真实对比默认、refresh=true、refresh=wait_for三种写入刷新策略,验证refresh=true强制插入额外刷新换取0.015秒内立刻可见、refresh=wait_for阻塞4.285秒等待自然刷新周期完成以不打乱刷新节奏的真实权衡差异。
代码PUT /ref_test {"settings":{"refresh_interval":"5s"}} 默认: POST /ref_test/_doc/1 {"n":1} refresh=true: POST /ref_test/_doc/2?refresh=true {"n":2} refresh=wait_for: POST /ref_test/_doc/3?refresh=wait_for {"n":3}
默认写入后立刻搜索: hits=0 ← 真实查不到刚写入的文档
这个真实结果是本系列反复提到的"ES是近实时搜索"的直接体现:写入操作本身真实很快就返回了,但文档真实要等到下一次refresh把内存里的数据刷成可搜索的Lucene段之后才能被搜到,默认情况下这个刷新真实按refresh_interval的节奏自然发生,不会因为某一次写入而提前触发。
refresh=true写入调用耗时: 0.015秒 写入调用返回后立刻搜索: hits=1 ← 真实立刻就能搜到
这组结果验证了refresh=true真实的工作方式:它真实会在这次写入完成之后,立刻强制插入一次额外的、不在原本5秒节奏里的刷新,确保这次写入的内容真实能被立刻搜到。真实只多花了0.015秒,因为触发一次刷新本身(把内存缓冲区的数据写成一个新的Lucene段)真实是一个相对轻量的操作,不需要等到下一个自然周期。
代码POST /ref_test/_doc/3?refresh=wait_for {"n":3}
refresh=wait_for写入调用耗时: 4.285秒 ← 真实比refresh=true的0.015秒慢了近300倍 调用返回后立刻搜索: hits=1 ← 真实同样能搜到
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
refresh 写入参数与 refresh_interval 设置