ES入门:查询和聚合

安装完ElasticSearch 和 Kibana后我们开始学习

为了方便测试,使用kibana的dev tool来进行学习测试:

测试工具

请在此添加图片描述

从索引文档开始

插入

向 Elasticsearch 索引 customer 的 _doc 类型的文档 id 为 1 的文档发送 PUT 请求的例子。

请求体为 JSON 格式,包含一个字段 name 和其值 DLBoy。

Elasticsearch 支持多种请求方法来对索引进行操作,其中包括 GET、POST、PUT、DELETE 等等。

在这个例子中,我们使用的 PUT 方法将更新或创建一个新的文档:

PUT /customer/_doc/1
{"name": "DLBoy"
}

/customer/_doc/1**,其中****customer是索引的名称,\_doc通常是文档类型(在Elasticsearch 7.x及更高版本中,文档类型通常被忽略),而1**是文档的唯一标识ID。

使用 PUT 方法提交文档时,如果指定的 id 已经存在,则该文档将被更新;如果不存在则该文档将被创建。在 POST 方法中,不需要提供 id 参数, Elasticsearch 会生成一个唯一的 id 。

请在此添加图片描述

查询

请在此添加图片描述

批量索引文档

下载测试数据

  • 下载 accounts.json (如果无法下载,也可以clone ES的官方仓库在新窗口打开,选择本文中使用的版本分支,然后进入/docs/src/test/resources/accounts.json目录获取)

数据的格式如下:

请在此添加图片描述

批量插入数据

  • 将accounts.json拷贝至指定目录,我这里放在/opt/下面

请在此添加图片描述

执行

curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@/opt/accounts.json"

解释

  • curl: 这是一个命令行工具,用于发起HTTP请求。
  • -H "Content-Type: application/json": 这是HTTP请求头,指定请求的内容类型为JSON。
  • -XPOST: 这指示curl执行HTTP POST请求。
  • "localhost:9200/bank/_bulk?pretty&refresh": 这是目标Elasticsearch服务器的URL,它指定了索引名称"bank",并在URL中使用"_bulk"来指示批量导入操作。pretty参数是可选的,用于格式化响应以使其更易阅读,refresh参数用于在导入完成后刷新索引,以使新数据立即可用。
  • --data-binary "@/opt/accounts.json": 这是HTTP请求的数据部分,它指定了要导入的数据文件的路径,这里是"/opt/accounts.json"。@符号表示要上传文件的路径。这个文件包含了要批量导入的JSON数据。

查看状态

curl "localhost:9200/_cat/indices?v=true" | grep bank

查询数据

查询所有

match_all表示查询所有的数据,sort即按照什么字段排序

GET /bank/_search
{"query": { "match_all": {} },"sort": [{ "account_number": "asc" }]
}

请在此添加图片描述

解释

这是一个Elasticsearch批量导入数据的响应示例。响应包含了以下信息:

  • "took" : 1: 表示处理请求所花费的时间,以毫秒为单位。
  • "timed_out" : false: 表示请求没有超时。
  • "_shards": 提供了与索引分片相关的信息,包括总分片数、成功的分片数、跳过的分片数和失败的分片数。
  • "total": 表示索引总共包含了1个分片。在分布式环境下,索引通常被分成多个分片以提高性能和可伸缩性。这里的值为1,表示索引可能是单一分片的。
  • "successful": 表示成功完成的分片数。在这里,所有的分片操作都成功,所以值为1。
  • "skipped": 表示跳过的分片数。在这个响应中,没有分片被跳过,所以值为0。
  • "failed": 表示失败的分片数。在这个响应中,没有分片失败,所以值为0。
  • "hits": 这是一个包含有关查询匹配文档的信息的部分。
  • "total": 提供了匹配查询条件的总文档数,这里是1000个文档。这是符合查询条件的文档总数。
  • "relation": 表示与总文档数的关系,这里是"eq",表示匹配文档的数量等于总文档数。其他可能的关系包括"gte"(大于或等于)、“lte”(小于或等于)等,根据查询条件的具体情况而定。
  • "hits": 这是一个文档数组,包含了查询匹配的文档。每个文档都包括了以下信息:
  • “_index”: 文档所属的索引名称,这里是"bank"。
  • “_type”: 文档的类型,通常在Elasticsearch 7.x及更高版本中使用"_doc"。
  • “_id”: 文档的唯一标识ID。
  • “_score” - 文档的相关性得分(使用match_all时不适用)
  • “_source”: 包含文档的实际数据。在这个示例中,包含了账户信息,如账号号码、余额、姓名、年龄、性别、地址等。
  • “sort” - 文档的排序位置(不按相关性得分排序时)

这个响应示例表明批量导入操作成功,共导入了1000个文档,并提供了匹配的文档详细信息。这些信息可用于后续的搜索和分析操作。


分页查询

from和size两个字段

GET /bank/_search
{"query": { "match_all": {} },"sort": [{ "account_number": "asc" }],"from": 10,"size": 10
}

请在此添加图片描述

指定字段查询

如果要在字段中搜索特定字词,可以使用match

查询address 字段中包含 mill 或者 lane的数据;

GET /bank/_search
{"query": {"match": {"address": "Holmes Lane"}}
}
  • "query": 查询请求的主体,指示Elasticsearch执行查询操作。
  • "match": 查询类型,表示执行一个文本匹配查询。
  • "address": 要匹配的字段名称,这里是"address"字段。
  • "Holmes Lane": 要匹配的文本内容,这里是"Holmes Lane"。查询将在"address"字段中查找包含"Holmes Lane"的文本。

请在此添加图片描述

由于ES底层是按照分词索引的,所以上述查询结果是address 字段中包含 Holmes 或者 Lane 的数据

查询段落匹配

查询的条件是 address字段中包含 “Holmes Lane”,则可以使用match_phrase

GET /bank/_search
{"query": {"match_phrase": {"address": "Holmes Lane"}}
}
  • "query": 查询请求的主体,指示Elasticsearch执行查询操作。
  • "match_phrase": 查询类型,表示执行一个短语匹配查询。
  • "address": 要匹配的字段名称,这里是"address"字段。
  • "Holmes Lane": 要匹配的短语,这里是"Holmes Lane"。查询将在"address"字段中查找包含完整短语"Holmes Lane"的文本。

请在此添加图片描述

多条件查询:

如果要构造更复杂的查询,可以使用bool查询来组合多个查询条件。

GET /bank/_search
{"query": {"bool": {"must": [{ "match": { "age": "40" } }],"must_not": [{ "match": { "state": "ID" } }]}}
}
  • "query": 查询请求的主体,指示Elasticsearch执行查询操作。
  • "bool": 查询类型,表示执行一个布尔查询,它可以包含多个条件。
  • "must": 这是一个数组,包含了必须匹配的条件。在这里,我们要求文档的"age"字段必须匹配值"40"。
  • "must_not": 这也是一个数组,包含了不能匹配的条件。在这里,我们要求文档的"state"字段不能匹配值"ID"。

请在此添加图片描述

Query or Filter

must,should,must_notfilter 都是bool查询的子句。

那么filterquery子句有啥区别呢?

查询条件

bool查询的子句中同时具备query,must 和 filter

GET /bank/_search
{"query": {"bool": {"must": [{"match": {"state": "ND"}}],"filter": [{"term": {"age": "40"}},{"range": {"balance": {"gte": 20000,"lte": 30000}}}]}}
}

Elasticsearch查询的示例,使用HTTP GET请求来搜索名为"bank"的索引中的文档。这个查询是一个复杂的布尔查询,包含了多个子查询条件,同时指定了必须匹配的条件和过滤条件。以下是这个查询的各个部分的解释:

  • HTTP方法:GET,表示发起一个查询请求。
  • 路径:/bank/_search,这是指定要搜索的索引名称为"bank",并且执行搜索操作。
  • 请求正文:这是一个包含查询条件的JSON请求体,用于定义查询的细节。在这个示例中,查询条件如下:
  • "query": 查询请求的主体,指示Elasticsearch执行查询操作。
  • "bool": 查询类型,表示执行一个布尔查询,它可以包含多个条件。
  • "must": 这是一个数组,包含了必须匹配的条件。在这里,我们要求文档的"state"字段必须匹配值"ND",即北达科他州。
  • "filter": 这是一个数组,包含了过滤条件,这些条件用于排除文档。在这里,有两个过滤条件:
  • "term": 这是一个精确匹配查询条件,要求文档的"age"字段必须精确匹配值"40"。
  • "range": 这是一个范围查询条件,要求文档的"balance"字段的值必须在20000到30000之间(包括20000和30000)。

所以,这个查询的目的是从"bank"索引中查找文档,这些文档同时满足以下条件:位于北达科他州(“state"字段匹配"ND”),年龄为40,账户余额在20000到30000之间。

请在此添加图片描述

只包含filter的查询:

GET /bank/_search
{"query": {"bool": {"filter": [{"term": {"age": "40"}},{"range": {"balance": {"gte": 20000,"lte": 30000}}}]}}
}

请在此添加图片描述

在Elasticsearch中,queryfilter都用于定义搜索条件,但它们之间有重要的区别,主要涉及到搜索的目的和结果处理方式。以下是它们的主要区别:

  1. 目的
  2. Query(查询):主要用于筛选和排序文档以匹配搜索查询,以便找到相关性最高的文档。查询条件会计算文档的相关性得分,然后对文档进行排序,以使最相关的文档排在前面。
  3. Filter(过滤):主要用于筛选文档,不涉及相关性得分或排序。过滤条件用于精确匹配文档,通常用于排除不符合条件的文档。
  4. 计算开销
  5. Query(查询):查询条件可能需要较大的计算开销,因为它们计算文档的相关性得分并进行排序。这在某些情况下可能会导致查询变得较慢。
  6. Filter(过滤):过滤条件通常具有较小的计算开销,因为它们不涉及相关性得分或排序。这使得过滤条件在性能上更高效。
  7. 结果处理方式
  8. Query(查询):查询结果会包括文档的相关性得分,文档按照相关性排序。查询条件用于找到最相关的文档,通常用于全文搜索等情况。
  9. Filter(过滤):过滤条件返回文档的精确匹配结果,结果不包括相关性得分。过滤条件用于精确筛选文档,通常用于精确匹配、范围查询、布尔条件等情况。

总之,query主要用于搜索和排序文档,通常在需要考虑相关性的情况下使用,如全文搜索。而filter主要用于筛选文档,通常在需要精确匹配和排除的情况下使用,如范围查询、精确匹配、布尔条件等。根据搜索需求,可以选择使用queryfilter或它们的组合,以达到所需的搜索目标。

聚合查询

我们知道SQL中有group by,在ES中它叫Aggregation,即聚合运算。

简单聚合

比如我们希望计算出account.json的数据中每个州的统计数量, 使用aggs关键字对state字段聚合,被聚合的字段无需对分词统计,所以使用state.keyword对整个字段统计

GET /bank/_search
{"size": 0,"aggs": {"group_by_state": {"terms": {"field": "state.keyword"}}}
}
  • “size”: 这指定了搜索结果的大小,这里是0,表示不返回实际文档结果,只返回聚合结果。
  • “aggs”: 这是用于定义聚合的部分。
  • “group_by_state”: 这是聚合的名称,可以自定义。
  • “terms”: 这是一种聚合类型,表示按照指定字段的值进行分组。在这里,我们希望按照"state.keyword"字段的值进行分组。
  • “field”: 这是要用于分组的字段,这里是"state.keyword",表示按照州的关键字值进行分组。

所以,这个查询的目的是执行一个名为"group_by_state"的聚合,根据文档中的"state.keyword"字段的值进行分组。它将生成一个分组列表,其中包含每个不同州的值,并统计每个州的文档数量。由于"size"设置为0,不会返回实际文档结果,只返回聚合结果,以供进一步分析或显示聚合数据。这种聚合操作对于分析文档集的统计信息非常有用。

请在此添加图片描述

Elasticsearch聚合操作的响应结果,具体包括了"aggregations"部分解释:

  • “aggregations”: 这是包含聚合结果的部分。
  • “group_by_state”: 这是聚合的名称,与查询中定义的聚合名称一致。
  • “doc_count_error_upper_bound”: 这是文档计数错误的上限,通常为0。它表示文档计数的错误限制,如果值大于0,表示可能存在计数错误。
  • “sum_other_doc_count”: 这是其他文档计数的总和,743表示总共有743个文档分配到了除分桶之外的"其他"类别中。
  • “buckets”: 这是分桶(buckets)的数组,包含了每个分组的信息。
  • 每个"bucket"包括以下信息:
  • “key”: 分组的键,即"state.keyword"字段的值。
  • “doc_count”: 分组中的文档计数,表示每个州拥有的文档数量。

在这个示例中,"group_by_state"聚合对"state.keyword"字段进行了分组,并列出了每个州的文档数量。例如,“TX”(得克萨斯州)有30个文档,“MD”(马里兰州)有28个文档,以此类推。这种聚合操作有助于了解文档集中各个分组的统计信息,通常用于数据分析和可视化。

嵌套聚合

ES处理聚合条件的嵌套。

计算每个州的平均结余。涉及到的就是在对state分组的基础上,嵌套计算avg(balance):

GET /bank/_search
{"size": 0,"aggs": {"group_by_state": {"terms": {"field": "state.keyword"},"aggs": {"average_balance": {"avg": {"field": "balance"}}}}}
}
  • “size”: 这指定了搜索结果的大小,这里是0,表示不返回实际文档结果,只返回聚合结果。
  • “aggs”: 这是用于定义聚合的部分。
  • “group_by_state”: 这是聚合的名称,用于按州进行分组。
  • “terms”: 这是一种聚合类型,表示按照指定字段的值进行分组,这里是"state.keyword"字段的值。
  • “aggs”: 这是在每个州分组内执行的嵌套聚合。
  • “average_balance”: 这是嵌套聚合的名称,用于计算每个州的平均账户余额。
  • “avg”: 这是嵌套聚合的类型,表示计算平均值。
  • “field”: 这是用于计算平均值的字段,这里是"balance"字段,表示计算每个州的账户余额的平均值。

所以,这个查询的目的是执行一个名为"group_by_state"的聚合,根据文档中的"state.keyword"字段的值进行分组。在每个分组内,还执行了一个名为"average_balance"的嵌套聚合,计算每个州的平均账户余额。由于"size"设置为0,不会返回实际文档结果,只返回聚合结果,以供进一步分析或显示聚合数据。这种聚合操作对于分析文档集的统计信息非常有用,包括平均值、总和、最小值、最大值等。

请在此添加图片描述

这是执行Elasticsearch聚合操作后的响应结果,具体包括了"aggregations"部分的解释:

  • “aggregations”: 这是包含聚合结果的部分。
  • “group_by_state”: 这是聚合的名称,与查询中定义的聚合名称一致。
  • “doc_count_error_upper_bound”: 这是文档计数错误的上限,通常为0。它表示文档计数的错误限制,如果值大于0,表示可能存在计数错误。
  • “sum_other_doc_count”: 这是其他文档计数的总和,743表示总共有743个文档分配到了除分桶之外的"其他"类别中。
  • “buckets”: 这是分桶(buckets)的数组,包含了每个分组的信息。
  • 每个"bucket"包括以下信息:
  • “key”: 分组的键,即"state.keyword"字段的值,表示各个州的名称。
  • “doc_count”: 分组中的文档计数,表示每个州的文档数量。
  • “average_balance”: 这是嵌套聚合计算的平均账户余额的结果。每个分组都包括一个"average_balance"字段,其中包含了平均值。

在这个示例中,"group_by_state"聚合对"state.keyword"字段进行了分组,列出了每个州的文档数量,并计算了每个州的平均账户余额。例如,“TX”(得克萨斯州)有30个文档,平均账户余额为26073.3,“MD”(马里兰州)有28个文档,平均账户余额为26161.535714285714,以此类推。这种聚合操作非常有助于对文档集进行统计和分析,以获得有关每个分组的信息。

聚合结果排序

通过在aggs中对嵌套聚合的结果进行排序

对嵌套计算出的avg(balance),这里是average_balance,进行排序

GET /bank/_search
{"size": 0,"aggs": {"group_by_state": {"terms": {"field": "state.keyword","order": {"average_balance": "desc"}},"aggs": {"average_balance": {"avg": {"field": "balance"}}}}}
}
  • “size”: 这指定了搜索结果的大小,这里是0,表示不返回实际文档结果,只返回聚合结果。
  • “aggs”: 这是用于定义聚合的部分。
  • “group_by_state”: 这是聚合的名称,用于按州进行分组。
  • “terms”: 这是一种聚合类型,表示按照指定字段的值进行分组,这里是"state.keyword"字段的值。
  • “order”: 这是一个选项,用于指定排序方式,这里按照嵌套聚合"average_balance"的降序排列。
  • “aggs”: 这是在每个州分组内执行的嵌套聚合。
  • “average_balance”: 这是嵌套聚合的名称,用于计算每个州的平均账户余额。
  • “avg”: 这是嵌套聚合的类型,表示计算平均值。
  • “field”: 这是用于计算平均值的字段,这里是"balance"字段,表示计算每个州的账户余额的平均值。

这个查询的目的是执行一个名为"group_by_state"的聚合,根据文档中的"state.keyword"字段的值进行分组,同时计算每个州的平均账户余额,并按照平均余额的降序排列结果。由于"size"设置为0,不会返回实际文档结果,只返回聚合结果,以供进一步分析或显示聚合数据。这种聚合操作有助于找到平均账户余额最高的州。

请在此添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1768.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

力扣——二叉树的后序遍历(C语言)

1.题目: 给你一棵二叉树的根节点 root ,返回其节点值的后序遍历。 2.原理: 这里的遍历,是要存入到数组中,所以需要建立数组,这里传参有*returnSize,需要求节点个数,可以调用前面Tr…

软件测试学习笔记丨Flask操作数据库-数据库和表的管理

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/23427 结构分析 Runner是中间件sqlachemy去驱动Runner,根据不同的数据库去驱动不同的中间件 demo # 导入Flask的类 from flask import Flask # 实例化 Flask的类,并且…

一个小程序如何对接多个收款账户?

背景 我又来了,之前对接过网约巴士系统 网约巴士旅游专线平台搭建历程,运营了两年多了。在运营中完善、在完善中学习,一直是不变的真理。有一句话说得好:先做一个垃圾、用起来再说。 今天又需要升级了,需求是&#…

模型 定位地图

系列文章 分享 模型,了解更多👉 模型_思维模型目录。心智导航现实的空间图。 1 定位地图模型的应用 1.1 小玉的职业定位与发展规划 小玉,24岁,市场营销专业本科毕业生,有半年汽车销售实习经历。毕业后,她…

java项目之协力服装厂服装生产管理系统的设计与实现(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的协力服装厂服装生产管理系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: …

[MySQL#7] CRUD(2) | 更新 | 删除 | 聚合函数 | group by

目录 3. 更新 4. 删除 截断表 日志的作用 5. (实验) 插入查询结果 6. 聚合函数 7. 分组查询 接着上篇文章[MySQL#6] 表的CRUD (1) | Create | Retrieve(查) | where继续讲解~ 3. 更新 语法: UPDATE table_name SET column expr [, column expr ...][WHE…

RT-Thread PIN设备 UART设备

引脚简介 芯片上的引脚一般分为四类:电源、时钟、控制与I/O。 I/O口在使用模式上又分为General Purpose Input Output(通用输入/输出),简称GPIO,与功能复用I/O(如SPI/I2C/UART等)。 大多数MCU…

【element ui系列】分享几种实现el-table表格单选的方法

在实际的开发中,经常会用到从表格中选择一条记录的情况,虽然官方给出的例子,但是给人感觉看起来不明显,于是,在此基础上做了改进。接下来,介绍两种常见的实现方法: 1、采用复选框(checkbox)实现…

FastAPI中如果async def和def 路由的区别

在python的整体生态中,虽然已经有很多库支持了异步调用,如可以使用httpx或者aiohttp代替requests库发起http请求,使用asyncio.sleep 代替time.sleep, 但是依然还有很多优秀的第三方库是不支持异步调用也没有可代替的库&#xff0c…

架构师备考-非关系型数据库

基础理论 CAP 理论 C(Consistency)一致性。一致性是指更新操作成功并返回客户端完成后,所有的节点在同一时间的数据完全一致,与ACID 的 C 完全不同。A (Availability)可用性。可用性是指服务一直可用&…

奥云学院应邀参加“第二届中国县域经济投资高峰论坛”

论坛聚焦战略,县域经济迎来新机遇 10月28日,由中国投资协会主办的第二届中国县域经济投资高峰论坛在北京盛大召开。本次论坛以“产业资本助力县域经济高质量发展”为主题,汇聚政府、企业、金融机构和学术专家等多方资源,集中探讨…

飞牛NAS docker compose环境下自建远程桌面服务:rustdesk

🛩️前言 由于国内向日葵、todesk等应用的日渐模糊,恰巧我们已经实现了ipv6的内网穿透,而且在国内ipv6的延迟极低,加上本次介绍的开源远程桌面项目Rustdesk,简直是绝配。 这个项目比较简单,话不多说&…

算法:查找

算法 1. 顺序查找和折半查找1.1 顺序查找1.2 折半查找1.3 索引顺序查找 2. 树表查找2.1 查找2.2 插入 3. 哈希表及哈希查找3.1 哈希造表3.2 处理冲突开放定址法链地址法 3.3 哈希查找 查找是非数值数据处理中一种基本运算,查找运算的效率与查找表所采用的数据结构和…

Istio基本概念及部署

一、Istio架构及组件 Istio服务网格在逻辑上分为数据平面和控制平面。 控制平面:使用全新的部署模式:Istiod,这个组件负责处理Sidecar注入,证书颁发,配置管理等功能,替代原有组件,降低复杂度&…

OpenCV视觉分析之目标跟踪(8)目标跟踪函数CamShift()使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 找到物体的中心、大小和方向。 CamShift(Continuously Adaptive Mean Shift)是 OpenCV 中的一种目标跟踪算法&#xff0…

gradlew命令打包报错:malformed input off : 50, length : 1

Execution failed for task :app:mapǧ��Ѫսƪ_officialOfficialReleaseSourceSetPaths. > Could not resolve all files for configuration :app:ǧ��Ѫսƪ_officialOfficialReleaseRuntimeClasspath. > Failed to trans…

[云] 大数据分析栈(Big Data Analytics Stack)+ Apache Hadoop分布式文件系统(HDFS)+Apache Spark

任务概述 本次作业旨在帮助你理解大数据分析栈(Big Data Analytics Stack)的工作原理,并通过实际操作加深认识。你将搭建Apache Hadoop分布式文件系统(HDFS)作为底层文件系统,并将Apache Spark作为执行引擎…

ESP8266 自定义固件烧录-Tcpsocket固件

一、固件介绍 固件为自定义开发的一个适配物联网项目的开源固件,支持网页配网、支持网页tcpsocket服务器配置、支持串口波特率设置。 方便、快捷、稳定! 二、烧录说明 固件及工具打包下载地址: https://download.csdn.net/download/flyai…

新能源汽车空调压缩机:科技驱动的冷暖核心

一、新能源汽车空调系统概述 新能源汽车空调系统在车辆中起着至关重要的作用,它直接影响着驾乘人员的舒适度。新能源汽车空调系统主要由制冷系统、加热系统、送风系统、操纵控制系统和空气净化系统等组成。 制冷系统通常由电动压缩机、冷凝器、压力传感器、电子膨…

Leetcode 213. 打家劫舍 II 动态规划

原题链接&#xff1a;Leetcode 213. 打家劫舍 II class Solution { public:int rob(vector<int>& nums) {int n nums.size();if (n 1)return nums[0];if (n 2)return max(nums[0], nums[1]);// 如果偷了第一家&#xff0c;就不能偷最后一家int dp[n - 1];dp[0] …