es 数据在被修改之后 再发起查询还是会查到未修改前的数据

Elasticsearch | 作者 陈锦涛 | 发布于2018年05月18日 | 阅读数:3100

es服务版本 5.3.3,es pom版本2.1.0,jest版本2.3,我使用的是jest httpclient方式,就是前端每次调一个修改数据的接口之后然后回调查询接口,结果就是会查到老数据(就是查到的那条数据是没有被修改的样子),后来尝试了在回调查询的时候增加了一点延时(500ms),效果提升了一点,可以成功查到修改后数据的样子了,但是不太稳定,时而成功时而失败,被这个问题困惑了好久,求解决!
已邀请:

yayg2008

赞同来自: laoyang360 陈锦涛

默认是1秒可见。如果你的需求一定要写完就可见,那在写的时候增加refresh参数,强制刷新即可。但强烈建议不这么干,因为这样会把整个集群拖垮。

mcs41531

赞同来自: 陈锦涛

refresh时间,默认1s

laoyang360 - [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自: 陈锦涛

可以在前端拿到后端的结果后,休眠>1s。就可以看到实时数据。

code4j - coder github: https://github.com/rpgmakervx

赞同来自: 陈锦涛

写后立马读的需求场景看能不能避免下,还有, query是走倒排索引查询的所以会出现refresh未执行搜索不到的情况,但是如果你用get,也就是通过id查询的话,他会先从translog拿一下,写translog是写操作的第一步,就不受refresh影响了。2.2的代码我看了是这么做的,但是5.x不太清楚了,

ccsy

赞同来自:

没必要做这种改完立刻查询的需求吧,这种操作还是放在数据库比较好

brucezhy

赞同来自:

你加一个waitfor参数就好了   但是这种需求很明显不适合ES

fanmo3yuan

赞同来自:

可以使用waitfor或者调小refresh时间,但refresh的时间不应太小(建议不小于300ms,这是我们的测试结果),可以根据自己的集群去测试一下合适的时间。但本质上还是要看es是否适合你的场景,它只是近实时系统。

hapjin

赞同来自:

还有一种方法,如果你能知道文档ID的话,可以用GET请求去获取这个文档,GET能够立即获取到该文档的。ES realtime GET

zqc0512 - andy zhou

赞同来自:

默认 1s 刷新 近实时

要回复问题请先登录注册