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.mzph.cn/bicheng/59529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker Remote API TLS 认证_docker远程接口未授权访问漏洞怎么解决

漏洞描述: Docker Remote API 是一个取代远程命令行界面的REST API,其默认绑定2375端口,如管理员对其配置不当可导致未授权访问漏洞。攻击者利用docker client或者http直接请求就可以访问这个API,可导致敏感信息泄露,…

华为eNSP:QinQ

一、什么是QinQ? QinQ是一种网络技术,全称为"Quantum Insertion",也被称为"Q-in-Q"、"Double Tagging"或"VLAN stacking"。它是一种在现有的VLAN(Virtual Local Area Network&#xff0…

利用SCF文件构建网络渗透

SMB是一种广泛用于企业组织中文件共享目的的网络协议。在内部的渗透测试中,发现包含明文密码和数据库连接字符串等敏感信息的共享文件并不罕见。但是,即使一个文件共享不包含任何可用于连接到其他系统的数据,但是未经身份验证的用户配置拥有该…

陀螺仪BMI323驱动开发测试(基于HAL库SPI通信)

参考资料 编写代码 读取芯片ID void BMI160_Init(void) {uint16_t chipID BMI323_read(BMI160_REG_CHIP_ID);debug("BMI323芯片ID为0x%x;", chipID);if (chipID ! 0x43){debug("未检测到BMI323;");}elsedebug("检测到陀螺仪BMI323;");u8 buf_…

基于vue框架的的流浪宠物救助系统25128(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,宠物类别,领养中心,领养申请,云投喂,申请入驻,义工入驻 开题报告内容 基于Vue框架的流浪宠物救助系统开题报告 一、项目背景 近年来,随着城市化进程的加速,流浪动物问题日益凸显。它们面临着食物短缺、疾…

Python | Leetcode Python题解之第541题反转字符串II

题目: 题解: class Solution:def reverseStr(self, s: str, k: int) -> str:t list(s)for i in range(0, len(t), 2 * k):t[i: i k] reversed(t[i: i k])return "".join(t)

机器学习2_支持向量机_线性可分——MOOC

目录 定义 线性可分(Linear Separable) 线性不可分(Nonlinear Separable) 数学化定义 问题描述 优化问题 线性可分定义 假定训练样本集是线性可分的 1、最小化(Minimize): 2、限制条件…

Java基础-Java中的常用类(上)

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 String类 创建字符串 字符串长度 连接字符串 创建格式化字符串 String 方法 System类 常用方法 方…

基于TRIZ理论的便携式光伏手机充电装置创新

随着智能手机功能的日益强大,电量消耗问题也日益凸显,尤其是在户外活动时,电量告急常常让人措手不及。面对这一挑战,基于TRIZ(发明问题解决理论)的创新思维,一款全新的便携式光伏手机充电装置应…

Django目录结构最佳实践

Django项目目录结构 项目目录结构配置文件引用修改创建自定义子应用方法修改自定义注册目录从apps目录开始 项目目录结构 └── backend # 后端项目目录(项目名称)├── __init__.py├── logs # 项目日志目录├── manage.py #…

《今日制造与升级》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问:《今日制造与升级》是不是核心期刊? 答:不是,是知网收录的正规学术期刊。 问:《今日制造与升级》级别? 答:国家级。主管单位:中国机械工业联合会 …

WPF中如何简单的使用CommunityToolkit.Mvvm创建一个项目并进行 增删改查

目录 开始前准备的数据库dbblog如下: 第一步:创建项目后下载四个NuGet程序包 第二步:删除原本的MainWindow.XAML文件 并创建如下的目录结构 然后在View文件夹下面创建Login.XAML和Main.XAML 并且在App.XAML中将启动项改为Login.X…

人工智能技术:未来生活的“魔法师”

想象一下,未来的某一天,你醒来时,智能助手已经为你准备好了早餐,你的智能家居系统根据你的心情和日程安排调整了室内的光线和音乐,而你的自动驾驶汽车已经在门口等你。这不是科幻小说,这是人工智能技术为我…

排序(用java实现)

排序 排序的概念及引用排序的概念常见的排序算法 常见排序算法的实现插入排序基本思想:直接插入排序希尔排序(缩小增量排序) 选择排序基本思想:直接选择排序堆排序 交换排序冒泡排序快速排序快速排序的优化快速排序非递归 归并排序基本思想归并排序归并排…

(C++回溯算法)微信小程序“开局托儿所”游戏

问题描述 给定一个矩阵 A ( a i j ) m n \bm A(a_{ij})_{m\times n} A(aij​)mn​,其中 a i j ∈ { 1 , 2 , ⋯ , 9 } a_{ij}\in\{1,2,\cdots,9\} aij​∈{1,2,⋯,9},且满足 ∑ i 1 m ∑ j 1 n a i j \sum\limits_{i1}^m\sum\limits_{j1}^na_{ij} i…

数字IC后端实现之Innovus Place跑完density爆涨案例分析

下图所示为咱们社区a7core后端训练营学员的floorplan。 数字IC后端实现 | Innovus各个阶段常用命令汇总 该学员跑placement前density是59.467%,但跑完place后density飙升到87.68%。 仔细查看place过程中的log就可以发现Density一路飙升! 数字IC后端物…

聊一聊Elasticsearch的索引的分片分配机制

1、什么是分片分配 分片分配是由ES主节点将索引分片移动到ES集群中各个节点上的过程。 该过程尽量保证,同一个索引的分片尽量分配到更多的节点上,以此来达到读写索引的时候可以利用更多硬件资源的效果。 在分配过程当中,也不能将某个主分片…

最详细【Elasticsearch】Elasticsearch Java API + Spring Boot集成 实战入门(基础篇)

Elasticsearch Java API Spring Boot集成 实战入门(基础篇) 一、初始Elasticseach1、什么是Elasticseach2、Elasticsearch生态2、Elasticsearch结构3、Elasticsearch核心概念4、Elasticsearch 实现全文检索的原理 二、Elasticsearch入门1、入门-环境安装…

文件操作:Xml转Excel

1 添加依赖 Spire.Xls.jar <dependency><groupId>e-iceblue</groupId><artifactId>spire.xls</artifactId><version>5.3.3</version></dependency>2 代码使用 package cctd.controller;import com.spire.xls.FileFormat; im…

物理验证Calibre LVS Debug案例之通过deleteEmptyModule解决LVS问题

上周帮助T12nm A55训练营学员debug一个Calibre LVS问题&#xff0c;小编觉得挺好的一个问题。这个问题之前没有遇到过&#xff0c;今天分享给大家。 数字IC后端先进工艺设计实现之TSMC 12nm 6Track工艺数字IC后端实现重点难点盘点 下图所示为Calibre LVS的报告。从报告中看到…