Elasticsearch:冷热数据
前言
由于我们公司的订单数据量过大(这对公司是一件好事,毕竟每天都有大量的流水,但对我们技术人员来讲就是一个挑战),所以老大提出了关于订单的“冷热数据拆分”,把最近3个月的数据依旧放在原来的数据源中,但同时在Elasticsearch中存储所有的订单数据,然后开辟几个查询历史订单API,这样原接口最多只允许访问三个月的订单数据,而想看到所有数据或者需要做统计的话需要从新开辟的接口里面查。
老大决定技术方案,而我们下面的小弟就是方案的实施者;我首先梳理了整个项目的所有与订单相关的功能、API、定时任务、消息队列、第三方调用接口,然后进行归类分析,哪些是跨时间维度的、哪些是分页查询等等,最后用思维导图呈现出来。
存储订单数据到es
既然已经确定了哪些功能需要改动,正式开工了!首先我先建一个es的订单文档结构,然后提供API将订单数据转存到ES里面,订单文档结构大致如下所示。
将订单数据转存到es里面的API如下

从es中查询订单数据
ok,我们现在已经把数据存储到es中了,并且在“elasticsearch-head”中也看到了数据了,现在我们需要自己写一个查询API,大致如下所示。

ok,查询API也写完了,我迫不及待地想要试一下,启动服务,执行查询语句,一看不行,根据父订单查不到?why???
问题原因
我通过term查询不到数据,但是根据match可以查到,后来发现是因为parentId字段类型设置的问题,因为设置了该字段类型为text类型,导致es对存储的数据建立了分词索引,大写字母都转成小写了,由于parentId是精确查询,所以我把类型改为keyword就可以了。

在这里我们不得不延伸聊一下term查询了。
term查询
常用的 term 查询,它可以用来处理数字(numbers)、布尔值(Booleans)、日期(dates)以及文本(text)。term查询数字的时候并没有什么问题,但是当我们对字符串类型的字段进行term查询时可能会得到意想不到的情况,可能明明有记录却查询不到,也可能查询出不符合预期的记录(就像你跟女朋友谈恋爱刚开始的时候,明明你已经主动了太多了,但女方还是没有反应,讲道理,做男人太难了)。
测试字段的分词情况

keyword和text的区别
keyword:存储数据时候,不会分词建立索引
text:存储数据时候,会自动分词,生成索引,并且全部小写
解决方案
把text改为keyword
将index属性设置成 not_analyzed 无需分析
写在最后
好兄弟可以点赞并关注我的公众号“javaAnswer”,全部都是干货。
