2、ElasticSearch高级查询

news/2024/11/23 20:33:37/

2、ElasticSearch高级查询

  • 一、ES基础查询
    • 1.1、数据准备
    • 1.2、查询所有文档
    • 1.3、匹配查询-match
    • 1.4、匹配查询-multi_match
    • 1.5、关键字精确查询-term
    • 1.6、多关键字精确查询-terms
    • 1.7、查询和过滤指定字段-includes和excludes
    • 1.8、组合查询-pool
    • 1.8、过滤(范围)查询-range
    • 1.9、模糊查询
    • 1.10、查询排序-order
    • 1.11、高亮查询-highlight
    • 1.12、分页查询-from-size
  • 二、聚合查询
    • 2.1 聚合查询注意点-fielddata
    • 2.2 聚合查询概念
    • 2.4 指标聚合
      • 2.4.1 指标聚合body体说明
      • 2.4.2 求平均值-avg
      • 2.4.3 去重统计-cardinality
      • 2.4.4 聚合统计汇总-stats
      • 2.4.5 同时查最大值和最小值-max-min
      • 2.4.6 百分位统计-percentiles
      • 2.4.7 百分位排名-percentiles
      • 2.4.8 字符串统计聚合-string_stats
      • 2.4.8 sum 统计总和--结合query
      • 2.4.9 count 统计总数-value_count
    • 2.5 桶聚合
      • 2.4.1 桶聚合基本操作
      • 2.4.2 过滤聚合-filter
      • 2.4.3 多桶过滤聚合-filter
      • 2.4.4 多桶过滤聚合2-filter-other_bucket_key
      • 2.4.5 全局聚合

一、ES基础查询

1.1、数据准备

#PUT请求
http://127.0.0.1:9200/student
#插入文档, POST请求
http://127.0.0.1:9200/student/_doc/1001
{"age":19,"nickname":"zhanggang","name":"张刚","sex":"男"
}
http://127.0.0.1:9200/student/_doc/1002
{"age":19,"nickname":"zhangkun","name":"张坤","sex":"男"
}
http://127.0.0.1:9200/student/_doc/1003
{"age":18,"nickname":"xiaohong","name":"小红","sex":"女"
}
http://127.0.0.1:9200/student/_doc/1004
{"age":17,"nickname":"xiaolan","name":"小蓝","sex":"女"
}

1.2、查询所有文档

下面这种写法,有没有body体,都可以查询所有文档,建议写上body体。
body体中的"query" 代表的是一个查询对象,里面可以有不同的查询属性。 "match_all"表示查询类型,match_all代表查询所有。还有 match,term , range 等查询类型,可以参考下面写法。
#1、GET请求
http://127.0.0.1:9200/student/_search
#请求body
{"query": {"match_all": {}} }

1.3、匹配查询-match

match 匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系。
可以发现,下面查询会把name为张刚和张坤的两条数据查出来。如果请求body中的name改为"张刚刚",同样是可以查出张刚和张坤的两条数据。 因为文档里的数据分词后,都有带"张"的词,对请求的name分词后,同样是有张,所以可以匹配上。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{"query": {"match": {"name":"张"}} 
}

1.4、匹配查询-multi_match

multi_match 与 match 类似,不同的是它可以在多个字段中查询。
比如下面的"张",它会在"name"和"nickname"字段分词查找。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{"query": {"multi_match": {"query": "张","fields": ["name","nickname"]}} 
}

1.5、关键字精确查询-term

term 查询,精确的关键词匹配查询,不对查询条件进行分词
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{"query": {"term": {"nickname": {"value": "zhanggang"}}}
}

1.6、多关键字精确查询-terms

terms 查询和 term 查询一样,不同的是terms支持对多个值精确查询,注意是对多个值。类似musql的in。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{"query": {"terms": {"nickname": ["zhanggang","zhangkun"]}} 
}

1.7、查询和过滤指定字段-includes和excludes

1、查询指定字段:ES在搜索的结果中默认把文档中保存在_source 的所有字段都返回。如果只想查询部分字段,可以添加_source 的过滤。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body,写法1,只查询name和nickname字段
{"_source": ["name","nickname"], "query": {"terms": {"nickname": ["zhanggang"]}} 
}
#请求body,写法2,只查询name和nickname字段
{"_source": {"includes": ["name","nickname"]}, "query": {"terms": {"nickname": ["zhanggang"]}}
}
2、过滤指定字段
includes:来指定想要显示的字段,(可以理解为默认为 includes,所以只配置显示那些字段时可省略)
excludes:来指定不想要显示的字段
#GET请求
http://127.0.0.1:9200/student/_search
#请求body,不查询name和nickname字段
{"_source": {"excludes": ["name","nickname"]}, "query": {"terms": {"nickname": ["zhanggang"]}}
}

1.8、组合查询-pool

组合查询就是把match、multi_match、term、terms组合查询。
must:与关系,相当于关系型数据库中的 and。
should:或关系,相当于关系型数据库中的 or。
must_not:非关系,相当于关系型数据库中的 not。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{"query":{"bool":{"must":[{"match":{"name":"张"}}],"must_not":[{"match":{"age":"27"}}],"should":[{"match":{"sex":"男"}}]}}
}

1.8、过滤(范围)查询-range

range 查询找出那些落在指定区间内的数字或者时间,和Mysql的比较符号是一样的。
比较符说明
gt大于
gte大于等于
lt小于
lte小于等于
#GET请求,查询大于16小于27
http://127.0.0.1:9200/student/_search
#请求body,查询age大于16小于27
{"query":{"range":{"age":{"gt":16,"lt":27}}}
}

1.9、模糊查询

待定:后面讲

1.10、查询排序-order

ES可以按照不同的字段进行排序,并且通过 order 指定排序的方式。desc 降序,asc 升序。
注意:也可以按照_score进行排序,上面没讲_score是什么,实际它就是查询出来的一个评分,也就是表示对查询条件匹配程度,匹配条件越大,_score就越大。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{"query":{"bool":{"must":[{"match":{"name":"张刚"}}]}},"sort":[   {"_score":{"order":"desc"}},{"age":{"order":"desc"}}]}

1.11、高亮查询-highlight

ES可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。
pre_tags:前置标签
post_tags:后置标签
fields:需要高亮的字段

fields中的name也是一个json,也可以指定一些参数,不过一般都是默认不用管的,下面可以指定的参数:
fragment_size:设置要显示的文本长度,默认100
number_of_fragments:设置指定的文本片段个数
no_match_size:设置那些query没有匹配到的doc,你的高亮可以显示前缀多少个字符
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{"query":{"match":{"name":"张刚"}},"highlight":{"pre_tags":"<font color='red'>","post_tags":"</font>","fields":{"name":{}}}
}

1.12、分页查询-from-size

分页查询需要加from和size参数:
from:当前页的起始索引,默认从 0 开始。
size:每页显示多少条。
from = (pageNum - 1) * size。
pageNum 表示第几页。
#GET请求
http://127.0.0.1:9200/student/_search
#请求body
{"query":{"match_all":{}},"sort":[{"age":{"order":"desc"}}],"from":0,"size":2
}

二、聚合查询

经过上面的学习,可以把ES的两种搜索模式:exact value-精确匹配(必须要支持分词)、exact value-精确匹配(不支持分词)。

2.1 聚合查询注意点-fielddata

1、在ES中,text类型的字段使用一种叫做fielddata的查询时内存数据结构,当字段被排序,聚合或者通过脚本访问时这种数据结构会被创建。它是通过从磁盘读取每个段的整个反向索引来构建的,然后存存储在java的堆内存中。
2、fileddata默认是不开启的。fielddata会消耗大量的堆内存空间,尤其是在加载大文本字段时。一旦fielddata已加载到堆中,它将在该段的生命周期内保留。加载fielddata很耗费性能的。
3、你只有打开某个字段的filedata,才可以对该字段进行聚合和排序,一般咱们对text类型的字段,不会用到聚合和排序的,ES本身也不推荐打开filedata。
4、注意:fileddata的概念,是对text类型来说的,其他类型没有fileddata概念。

2.2 聚合查询概念

聚合(aggs)不同于普通查询,是目前学到的第二种大的查询分类,第一种即“query”,因此在代码中的第一层嵌套由“query”变为了“aggs”。用于进行聚合的字段必须是exact value(精确匹配),分词字段不可进行聚合,对于text字段如果需要使用聚合,需要开启fielddata,但是通常不建议,因为fielddata是将聚合使用的数据结构由磁盘(docvalues)变为了堆内存(fielddata),大数据的聚合操作很容易导致内存溢出。

聚合分类:
指标聚合(Metrics agregations):类似MYSQL中的函数,主要用于最大值、最小值、平均值、字段之和等指标的统计
桶聚合(Bucket agregations):类似MYSQL中的group by的作用,主要用于统计不同类型数据的数量
管道聚合(Pipeline agregations):用于对聚合的结果进行二次聚合

2.4 指标聚合

2.4.1 指标聚合body体说明

aggregation_name 为聚合返回结果的名称,由我们自己定义
agg_name 为聚合的参数,比如最大值(max)最小值(min),平均值(avg)等
field_name 表示根据某个字段聚合
missing 表示缺失值补充,比如当我们算age的平均值,有的文档没age字段,平均值就不包括该文档。如果加上missing,则表示,如果没age字段,则把age按指定的值处理算,这时平均值就包含该文档的了。一般情况下不写missing字段。
size:0表示是否返回聚合的源数据,加上表示不会返回,不加表示会返回,看个人需要是否添加。
#GET请求
#指标聚合body体
{"size": 0,"aggs": {"aggregation_name": {"agg_name": {"field": "field_name","missing": 0}}}
}

2.4.2 求平均值-avg

#GET请求,求字段age的平均值
http://127.0.0.1:9200/student/_search
#请求body
{"size": 0,"aggs": {"avg_balance_result": {"avg": {"field": "age"}}}
}

2.4.3 去重统计-cardinality

#GET请求,求字段age去重后的数量
http://127.0.0.1:9200/student/_search
#请求body
{"size": 0,"aggs": {"age_count_result": {"cardinality": {"field": "age"}}}
}

2.4.4 聚合统计汇总-stats

实际上就是查询文档count数量,age最小值min,age最大值max,age平均值avg,age总数sum。
注意:把stats换成extended_stats,会得到方差,标准差等数据。
#get请求,求字段age的平均值
http://127.0.0.1:9200/student/_search
#请求体
{"size": 0,"aggs": {"age_stats_result": {"stats": {"field": "age"}}}
}
#返回数据
{"took": 3,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 4,"relation": "eq"},"max_score": null,"hits": []},"aggregations": {"age_stats_result": {"count": 3,"min": 18,"max": 19,"avg": 18.666666666666668,"sum": 56}}
}

2.4.5 同时查最大值和最小值-max-min

#get请求,求字段age的最大值和最小值
http://127.0.0.1:9200/student/_search
#请求体
{"size": 0,"aggs": {"max_age_result": {"max": {"field": "age"}},"min_age_result": {"min": {"field": "age"}}}
}

2.4.6 百分位统计-percentiles

2.4.7 百分位排名-percentiles

2.4.8 字符串统计聚合-string_stats

该功能主要是统计字符串从的最大长度,最小长度,平均长度等。
注意:该功能不属于对值的计算,所以text和keyword,都可以进行请求。
如果我们需要进行统计的字段如果是 text 字段,那么就需要加上 .keyword 来进行统计,如果是字段属性是 keyword,就不需要这样处理。
#get请求
http://127.0.0.1:9200/student/_search
#请求body
{"size": 0,"aggs": {"name_stats_result": {"string_stats": {"field": "name.keyword"}}}
}

2.4.8 sum 统计总和–结合query

#get请求
http://127.0.0.1:9200/student/_search
#请求body
{"size": 0,"query": {"match": {"name": "张"}}, "aggs": {"age_sum_result": {"sum": {"field": "age"}}}
}

2.4.9 count 统计总数-value_count

#get请求
http://127.0.0.1:9200/student/_search
#请求body
{"size": 0,"aggs": {"age_count_result": {"value_count": {"field": "age"}}}
}

2.5 桶聚合

2.4.1 桶聚合基本操作

对age做分组操作,size字段表示现在几组,比如age分了100组,下面20则表示,只显示20组。
#get请求
http://127.0.0.1:9200/student/_search
#请求body
{"size": 0,"aggs": {"bucket_age": {"terms": {"field": "age","size": 20}}}
}

2.4.2 过滤聚合-filter

如果我们想针对某特定的数据进行聚合,那么就涉及数据的过滤,筛选出特定的数据进行聚合。

比如我们想筛选出 name的值为 “张刚” 的数据,然后对其进行取平均数的操作,我们可以使用 filter 来如下操作。

注意:因为我们写入数据前,没有预先定义字段的类型,所以 es 中将其自动转化成 text 属性的字段,所以在查询的时候用到的是 name.keyword,意思是对 name字段的内容作为整体进行筛选。

如果name本身是 keyword 属性,就不用加 .keyword 来操作。

#get请求
http://127.0.0.1:9200/student/_search
#请求body
{"size": 0,"aggs": {"bucket_gender_result": {"filter": {"term": {"name.keyword": "张刚"}},"aggs": {"avg_age_result": {"avg": {"field": "age"}}}}}
}

2.4.3 多桶过滤聚合-filter

在上一点(2.4.2)我们过滤的是单个条件,name='张刚' 的情况,如果我们想要实现多个过滤来操作,可以使用 filters,使用方法也不一样。
如下:得到的是name为"张刚"和"张坤的数据条数"
#get请求
http://127.0.0.1:9200/student/_search
#请求body
{"size": 0,"aggs": {"bucket_gender": {"filters": {"filters": {"female": {"term": {"name.keyword": "张刚"}},"male": {"term": {"name.keyword": "张坤"}}}}}}
}
如果想在此基础上接着对其进行均值计算,和前面的 filter 操作一样,在第一个 filters 同级的地方,加上我们的指标聚合操作:
#get请求
http://127.0.0.1:9200/student/_search
#请求body
{"size": 0,"aggs": {"bucket_gender": {"filters": {"filters": {"g_result": {"term": {"name.keyword": "张刚"}},"k_result": {"term": {"name.keyword": "张坤"}}}},"aggs": {"avg_balance": {"avg": {"field": "age"}}}}}
}

2.4.4 多桶过滤聚合2-filter-other_bucket_key

和2.4.3相比,如果获取name为张刚和张坤外的的平均age的值,只需要加个other_bucket_key就可以实现,如下:
#get请求
http://127.0.0.1:9200/student/_search
#请求body
{"size": 0,"aggs": {"bucket_gender": {"filters": {"other_bucket_key": "non_gender_result", "filters": {"g_result": {"term": {"name.keyword": "张刚"}},"k_result": {"term": {"name.keyword": "张坤"}}}},"aggs": {"avg_balance": {"avg": {"field": "age"}}}}}
}

2.4.5 全局聚合

https://mp.weixin.qq.com/s?__biz=Mzg5ODczMTA0Mw==&mid=2247485299&idx=1&sn=db05433c817b85dd31b65f6d06ac4f47&chksm=c05f5a3ff728d3296ad0ed48495ee65b3f37d2f417a66c5f482a8190faf2278a0b5b4b10d51d&cur_album_id=2701256983458676736&scene=189#wechat_redirect


http://www.ppmy.cn/news/903679.html

相关文章

如何区分SOLIDWORKS曲面与实体

今天给各位简单介绍一下SOLIDWORKS软件当中的曲面。我们如何区分实体与曲面&#xff0c;怎么由曲面创建实体以及由实体分解为曲面。 在SOLIDWORKS中提供了丰富的曲面功能&#xff0c;可以使用曲面的功能来创建一些外形复杂、使用实体建模方法不易创建的模型&#xff0c;我们可以…

SOLIDWORKS软件 实用小技巧汇总篇

01、SolidWorks正版软件草图绘制方法与技巧 草图最佳操作流程 创建新零件 选择一个基准面&#xff0c;第一基准面能较好的显示整个模型特征 创建新草图 绘制几何体(轮廓)&#xff0c;灵活使用阵列、镜向命令 添加草图几何关系 标注尺寸 理解草图的状态(多数草图建议完全…

SolidWorks快速安装螺栓

1、点击“插入零部件”下方的小三角&#xff0c;选择“随配合复制”&#xff1b; 2、选择要复制的螺栓&#xff1b; 3、点击“下一步”&#xff1b; 4、选择螺栓需要安装的同心配合的螺栓孔圆柱面&#xff0c;及螺栓贴合的平面&#xff0c;即完成螺栓的装配&#xff1b; 5…

SolidWorks安装失败,怎么彻底删除SolidWorks?

SolidWorks安装失败&#xff0c;怎么完全彻底删除清理干净SolidWorks各种残留注册表和文件呢&#xff1f;有些同学想把SolidWorks重新安装&#xff0c;但是SolidWorks安装失败显示失败&#xff0c;有时SolidWorks安装到一半就显示失败&#xff0c;然后会问SolidWorks无法重装是…

solidworks 文件服务器,solidworks配置服务器

solidworks配置服务器 内容精选 换一换 可以一次添加一台服务器,也可以一次添加同一网段连续IP的多台服务器。进入任务中心可以查看状态信息,如果状态为成功,说明服务器已添加成功。 外部镜像文件在从原平台导出前,没有按照“Windows操作系统的镜像文件限制”的要求完成初始…

SolidWorks导入CAD草图

SolidWorks导入CAD草图 准备工作 准备导入SolidWorks的CAD图最好去掉标注的尺寸线&#xff0c;并将草图以图纸绝对原点为坐标原地&#xff0c;方便导入。 使用move&#xff08;移动命令&#xff09;&#xff0c;选择基准点&#xff0c;输入#0,0&#xff08;绝对坐标点&#xf…

SolidWorks渲染图

1.打开渲染工具 2. 进入渲染选项 3. 渲染选项设置 4. 打开预览窗口 5. 调整渲染画面 6. 没有问题后点击最终渲染 7. 渲染完成后点击保存图像&#xff0c;选择png格式 8. 如果光影效果不对&#xff0c;可以选择进入编辑布景&#xff0c;关闭

Solidworks使用问题

我的Solid works重装过几次&#xff0c;期间碰到过很多的问题&#xff0c;也积累了一点经验&#xff0c;在这里简单记录一下。 这两个问题都和VBA的安装有关&#xff0c;且两者之间存在一定的因果关系。 问题一&#xff1a;Solidworks安装过程中VBA安装失败。 一般是…