记录一次工作中遇到的问题。
后台管理系统中管理功能将数据保存到数据库一份,同时也保存到ES中一份,然后终端POS从ES中取数据。
这时候问题来了,通过管理功能删除数据,同步去删除ES中的数据,然而,数据库中的数据已被删除,ES中的数据还在,等1-2分钟之后ES中数据才消失。这导致终端POS不能显示最新的数据。
下面来看看问题的解决过程。
先来看看实体类的配置。
ESWindowgoods代表窗口菜单功能,ESWindowgoodsFuture代表未来菜谱功能,从document注解中的参数来看,两个索引实体类的刷新间隔是一样的。
但是实际功能操作过程中发现,窗口菜单功能删除菜品后,ES不会立即删除,未来菜谱功能删除菜品后,ES会立即删除。为什么配置一样,两个功能删除操作后的行为不一样呢?
这时候我决定看一下实际ES索引的设置到底是什么,这里我们使用elasticsearch-head插件来查看。
![](/qrcode.jpg)
点击索引下面的信息,然后再点击索引信息,这时候就可以看到索引的初始设置以及属性信息了
我们可以看到windowgoodsindex索引的refresh_interval属性是-1,意思是不刷新。这样就可以解释,为什么删除数据后,ES中没有立即删除,而是过1-2分钟再删这个现象了。
我们再来看看windowgoodsfutureindex索引的refresh_interval属性,也是-1,这个索引其实是我后来重建的,重建之前,这个属性不存在,因此该属性默认为1。这就能解释,为什么窗口菜单删除的数据ES不能立即刷新,未来菜谱删除的数据ES能立即刷新这个现象了。于是,我们要重建windowgoodsfutureindex索引。
我们用这个命令重建索引,由于不想删除原先索引中的数据,所以需要先把原索引数据导入到新索引中。导入完之后,我们将未来菜谱功能的索引更换到新索引上,再次测试删除数据,这次发现删除完之后,数据库中删了,但是未来菜谱的ES中还存在数据,这就和窗口菜单的删除操作后不删ES数据的问题一致了。等等,问题貌似没有解决啊。上面的几个步骤,发现问题,查看索引设置,重建索引,两个索引的刷新时间保持一致,最终删除数据后,ES里的数据还是删除不了。好了,最后我们去删除后去调用ES的手动刷新方法来达到这个目的。
好了,再次测试,执行删除操作后,ES中的数据可以删除了。windowgoodsfutureindex和windowgoodsindex索引的刷新行为也保持一致了