要求:
Es查询:
查询工单信息, 输入 “测试”,查出 form_name 为字段中有查询出含有符合内容的数据
match:分词模糊查询:
比如“Everything will be OK, All is well”,会被分词一个一个单词(不是单个字母)
match_phrase :短语模糊查询
match_phrase是短语搜索,即它会将给定的短语(phrase)当成一个完整的查询条件。
比如查询 “Everything will”,会当成一个完整的短语进行查询, 会查出含有该查询条件的内容。
如果是查询单个字母,match就不管用了,那该如何处理呢?
wildcard:通配符模糊查询:
匹配任意字符
匹配0个或多个字符
记录是存在的,但是没有查出来? 因为分词的影响,添加keyword 进行处理
Wildcard 性能会比较慢。如果非必要,尽量避免在开头加通配符 ? 或者 *,这样会明显降低查询性能
如果查询的内容非空,怎么处理? 直接用*
总结:
Es 模糊查询, 分词的用match; 短语的用match_phrase;查询任意的,用wildcard通配符,注意查询的内容是否分词,分词的添加keyword,查询非空的情况,用*。
最近使用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的数据
刚开始时候一直无法实现,可以搜索 京 查询出数据;或者搜索 A00000 查询到数据,但是使用全部 京A00000 查询数据为空。
后来确定原因,因为为text,所以这个字段在保存时会分词,所以索引中不会有 京A00000,因此解决思路就是该字段type指定为keyword,同时使用查询时指定查询时使用keyword,如下。
boolQueryBuilder.must(QueryBuilders.wildcardQuery("plateNo.keyword", (" 京A00000 ")))
解决问题。
创建一个测试用的索引,格式如下:
term:精确查询,不会对输入做分词,如果输入的是"战某某",则直接查询"战某某",如果输入的是"浙江战某某",则直接查询"浙江战某某"
match:模糊匹配,需要指定字段名,输入会进行分词,如输入"浙江战某某",根据中文分词会分词为"浙江"和"战某某",然后进行匹配。如果待查询的字段包含"浙江"或"战某某",或者都包含,结果都会被查询出来。
根据上面第4点,可以知道match查询会对输入进行分词,我们可以指定对分词后的结果进行and和or查询。and:代表分词后的所有结果都得匹配,or:代表分词后只要有一个结果匹配就行(默认是or,上述第四点就是or的场景)
multi_match:多字段模糊查询,和match类似都是模糊查询,但multi_match可以指定多字段进行模糊查询。
query_string:和match类似,但是match需要指定字段名,query_string是在所有字段中搜索,范围更广泛(当然query_string也支持指定字段查询)。
must: 相对于条件and,必须同时满足多条件
should:相当于条件or,只要有一个或部分条件满足
must_not: 非,不满足条件
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)