最近使用ES时,有一个简单的需求,要求实现按照某个字段实现类似mysql中的like查询。
这里记录下实现方式。
这里java的api使用的是RestHighLevelClient,RestHighLevelClient从字面意思理解就是restful风格的高级别的客户端,底层封装的是一个http连接池,当需要执行 update、index、delete操作时,直接从连接池中取出一个连接,然后发送http请求到ElasticSearch服务端,服务端基于Netty接收请求。新版本的elasticsearch java client 都推荐用RestHighLevelClient去连接ES集群。
以下为实现方式:
这里要实现模糊匹配的字段为:plateNo(业务上表示车牌号)
以下是一开始的实现方法。plateNo字段type为text,现在保存了一条值为京A00000的数据
boolQueryBuilder.must(QueryBuilders.wildcardQuery("plateNo", ("*京A00000*")));
刚开始时候一直无法实现,可以搜索 京 查询出数据;或者搜索 A00000 查询到数据,但是使用全部 京A00000 查询数据为空。
后来确定原因,因为为text,所以这个字段在保存时会分词,所以索引中不会有 京A00000,因此解决思路就是该字段type指定为keyword,同时使用查询时指定查询时使用keyword,如下。
boolQueryBuilder.must(QueryBuilders.wildcardQuery("plateNo.keyword", ("京A00000")));
解决问题。
网友评论