Es 模糊查询的方式

Es 模糊查询的方式,第1张

Es 模糊查询的方式

要求:

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: 非,不满足条件


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10098706.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存