Elasticsearch 7.X RESTful 风格 高级查询
Posted 小毕超
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch 7.X RESTful 风格 高级查询相关的知识,希望对你有一定的参考价值。
一、Elasticsearch
上篇文章中我们简单介绍了ES,并介绍了索引、文档、映射的操作,今天我们学习下复杂的高级查询。
上篇文章地址:https://blog.csdn.net/qq_43692950/article/details/122222522
本篇还是使用PostMan进行测试。还是基于上篇文章中创建的user索引。
二、RESTful 风格 高级查询
1. 查询所有文档
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
2. match 匹配查询
match 匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系。
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
请求体内容为:
"query":
"match":
"name": "张三四"
由于没有配制Ik中文分词,这里会将一个汉字分为一个词。
3. 多字段匹配查询
上面只是对name进行的查询,还可以多个字段进行查询:
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
请求体内容为:
"query":
"multi_match":
"query": "男",
"fields": ["name", "sex"]
4. term 关键字精确查询
term 查询,精确的关键词匹配查询,不对查询条件进行分词。
term是完全匹配检索, 要用在不分词的字段上,,如果某个field在映射中被分词了,term检索将不起作用,所以,不分词的field,要在mapping中设置为不分词。
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
请求体内容为:
"query":
"term":
"name": "张三"
5. terms 多关键字精确查询
terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于 mysql 的 in。
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
请求体内容为:
"query":
"terms":
"name": ["zhangsan", "lisi"]
6. 投影查询,指定查询字段
默认情况下,Elasticsearch 在搜索的结果中,会把文档中保存在_source 的所有字段都返回。如果我们只想获取其中的部分字段,我们可以添加_source 的过滤。
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
"_source": ["name", "sex"],
"query":
"terms":
"name": ["zhangsan"]
7. 过滤字段
includes:表示想要显示的字段
excludes:表示不想要显示的字段
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
"_source":
"excludes": [ "sex"]
,
"query":
"terms":
"name": ["zhangsan"]
8. 组合查询
bool
把各种其它查询通过must
(必须 )、must_not
(必须不)、should
(应该)的方式进行组合。
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
"query":
"bool":
"must": [
"match":
"name": "lisi"
],
"must_not": [
"match":
"age": "40"
],
"should": [
"match":
"sex": "男"
]
9. 范围查询
range 查询找出那些落在指定区间内的数字或者时间。range 查询允许以下字符。
操作符 | 说明 |
---|---|
gt | 大于> |
gte | 大于等于>= |
gt | 小于< |
lt | 小于等于<= |
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
"query":
"range":
"age":
"gte": 15,
"lte": 30
10. 模糊查询
返回包含与搜索字词相似的字词的文档。
编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括:
- 更改字符(box → fox)
- 删除字符(black → lack)
- 插入字符(sic → sick)
- 转置两个相邻字符(act → cat)
为了找到相似的术语,fuzzy 查询会在指定的编辑距离内创建一组搜索词的所有可能的变体
或扩展。然后查询返回每个扩展的完全匹配。
通过 fuzziness 修改编辑距离。一般使用默认值 AUTO,根据术语的长度生成编辑距离。
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
"query":
"fuzzy":
"name":
"value": "zhang"
11. 单字段排序
sort 可以让我们按照不同的字段进行排序,并且通过 order 指定排序的方式。desc 降序,asc升序。
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
"query":
"match":
"name": "zhangsan"
,
"sort": [
"age":
"order": "desc"
]
12. 多字段排序
假定我们想要结合使用 age 和 _score 进行查询,并且匹配的结果首先按照年龄排序,然后按照相关性得分排序。
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
"query":
"match_all":
,
"sort": [
"age":
"order": "desc"
,
"_score":
"order": "desc"
]
13. 高亮查询
在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮。
Elasticsearch 可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。
在使用 match 查询的同时,加上一个 highlight 属性:
- pre_tags:前置标签
- post_tags:后置标签
- fields:需要高亮的字段
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
"query":
"match":
"name": "zhangsan"
,
"highlight":
"pre_tags": "<font color='red'>",
"post_tags": "</font>",
"fields":
"name":
14. 分页查询
from:当前页的起始索引,默认从 0 开始。 from = (pageNum - 1) * size
size:每页显示多少条
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
"query":
"match_all":
,
"sort": [
"age":
"order": "desc"
],
"from": 0,
"size": 2
15. 聚合查询
聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很多其他的聚合,例如取最大值、平均值等等。比如对某个字段取最大值 max
向 ES 服务器发 GET 请求 :
http://127.0.0.1:9200/user/_search
"aggs":
"max_age":
"max":
"field": "age"
,
"size": 0
16. prefix 前缀检索
会扫描所有倒排索引
http://127.0.0.1:9200/user/_search
"query":
"prefix":
"name": "张"
17. wildcard 通配符检索
会扫描所有倒排索引
http://127.0.0.1:9200/user/_search
"query":
"wildcard":
"name": "张*"
18. regexp 正则查询
会扫描所有倒排索引
http://127.0.0.1:9200/user/_search
"query":
"regexp":
"name": "(张三)|(李四)"
19. boost 评分权重
通过boost参数, 令满足某个条件的文档的得分更高,从而使得其排名更靠前。
http://127.0.0.1:9200/user/_search
"query":
"match":
"name":
"query":"张三",
"boost": 2
喜欢的小伙伴可以关注我的个人微信公众号,获取更多学习资料!
以上是关于Elasticsearch 7.X RESTful 风格 高级查询的主要内容,如果未能解决你的问题,请参考以下文章