ElasticSearch | Elasticsearch与Kibana页面查询语句实践

关注:CodingTechWork

引言

  在当今大数据应用中,Elasticsearch(简称 ES)以其高效的全文检索、分布式处理能力和灵活的查询语法,广泛应用于各类日志分析、用户行为分析以及实时数据查询等场景。通过 ES,用户可以轻松地查询大量数据、进行复杂的数据筛选、聚合分析等操作。
  本文将结合实际应用场景,深入讲解 Elasticsearch 基础和高级查询语句的使用原理与技巧,帮助读者通过实践掌握 ES 查询的核心概念和技术。

索引

索引设计与数据模型

  首先,我们假设demo_operate_log_data_m202501_read索引存储了用户的基本信息。每个文档表示一个用户,字段包括:

user_id:用户唯一标识符(例如:user_123)
name:用户姓名
age:用户年龄
gender:用户性别(如:male 或 female)
email:用户邮箱
phone_number:用户电话号码
register_date:用户注册时间(日期类型)
last_login:用户最后登录时间(日期类型)
location:用户所在地理位置(如:Beijing、Shanghai)

  这些字段将在我们接下来的查询中作为查询条件,以获取用户的详细信息。下面将根据不同的查询需求展示 Elasticsearch 查询的基础和高级用法。

创建索引

  在 Elasticsearch 中,创建索引时,通常会定义索引的映射(mapping),指定字段类型、分析器等属性。下面是一个示例索引创建语句,针对 demo_operate_log_data_m202501_read索引,我们假设它包含了与用户相关的字段。

示例:demo_operate_log_data_m202501_read索引创建语句

PUT /demo_operate_log_data_m202501_read
{
  "mappings": {
    "properties": {
      "user_id": {
        "type": "keyword"  // 用户唯一标识符,通常用 keyword 类型以便精确匹配
      },
      "name": {
        "type": "text"  // 用户姓名,使用 text 类型以支持全文搜索
      },
      "age": {
        "type": "integer"  // 用户年龄,使用整数类型
      },
      "gender": {
        "type": "keyword"  // 用户性别,通常是固定值,使用 keyword 类型
      },
      "email": {
        "type": "keyword"  // 用户邮箱,使用 keyword 类型
      },
      "phone_number": {
        "type": "keyword"  // 用户电话号码,使用 keyword 类型
      },
      "register_date": {
        "type": "date"  // 注册时间,使用日期类型
      },
      "last_login": {
        "type": "date"  // 最后登录时间,使用日期类型
      },
      "location": {
        "type": "text"  // 用户所在位置,使用 text 类型以支持全文搜索
      }
    }
  }
}

解释:

  • user_id:使用 keyword 类型,这样可以确保查询时进行精确匹配,因为 keyword 不会被分词。
  • name:使用 text 类型,支持全文搜索,可以在姓名中进行模糊搜索。
  • age:使用 integer 类型,用于存储年龄的整数值。
  • gender、email 和 phone_number:使用 keyword 类型,这些字段通常会是固定值或标识符,适合精确查询。
  • register_date 和 last_login:使用 date 类型,适合存储日期时间格式数据。
  • location:使用 text 类型,以便对用户的地理位置信息进行全文搜索。

插入数据

  接下来我们将根据刚才定义的demo_operate_log_data_m202501_read索引,插入一些示例数据。这些数据将包括用户的user_id、name、age、gender、email、phone_number、register_date、last_login 和 location字段。

POST /demo_operate_log_data_m202501_read/_doc/1
{
  "user_id": "U001",
  "name": "Alice Wang",
  "age": 29,
  "gender": "female",
  "email": "alice.wang@example.com",
  "phone_number": "+86-13800000001",
  "register_date": "2023-01-15T10:30:00",
  "last_login": "2025-01-05T15:45:00",
  "location": "Beijing, China"
}

POST /demo_operate_log_data_m202501_read/_doc/2
{
  "user_id": "U002",
  "name": "Bob Zhang",
  "age": 34,
  "gender": "male",
  "email": "bob.zhang@example.com",
  "phone_number": "+86-13800000002",
  "register_date": "2022-06-10T08:20:00",
  "last_login": "2025-01-06T09:00:00",
  "location": "Shanghai, China"
}

POST /demo_operate_log_data_m202501_read/_doc/3
{
  "user_id": "U003",
  "name": "Charlie Li",
  "age": 25,
  "gender": "male",
  "email": "charlie.li@example.com",
  "phone_number": "+86-13800000003",
  "register_date": "2024-03-22T14:10:00",
  "last_login": "2025-01-07T18:30:00",
  "location": "Guangzhou, China"
}

POST /demo_operate_log_data_m202501_read/_doc/4
{
  "user_id": "U004",
  "name": "David Liu",
  "age": 40,
  "gender": "male",
  "email": "david.liu@example.com",
  "phone_number": "+86-13800000004",
  "register_date": "2020-11-18T16:50:00",
  "last_login": "2025-01-04T12:00:00",
  "location": "Shenzhen, China"
}

POST /demo_operate_log_data_m202501_read/_doc/5
{
  "user_id": "U005",
  "name": "Eva Zhang",
  "age": 31,
  "gender": "female",
  "email": "eva.zhang@example.com",
  "phone_number": "+86-13800000005",
  "register_date": "2021-09-30T11:00:00",
  "last_login": "2025-01-06T16:10:00",
  "location": "Chengdu, China"
}

在这里插入图片描述
在这里插入图片描述

解释:

  • 每条数据通过 POST 请求插入到 Elasticsearch 索引demo_operate_log_data_m202501_read 中。
  • 数据中的 user_id 为每个用户的唯一标识符。
  • name、age、gender、email、phone_number、register_date、last_login 和 location 都是与用户相关的属性,按需求填充相应的信息。
  • 日期格式为yyyy-MM-dd'T'HH:mm:ss,符合 Elasticsearch 的日期格式。

插入成功后的输出:

  插入数据成功后,Elasticsearch 会返回类似下面的响应(每个请求的响应可能有所不同,以下是一个例子):

{
  "_index": "demo_operate_log_data_m202501_read",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

  每个用户的文档都会被成功插入到索引中,并可以通过 ID 或查询来访问。

基础查询

精确匹配查询 (term 查询)

在 Elasticsearch 中,精确匹配查询通常使用 term 查询。假设我们要查询 user_id 为 U001 的用户基本信息,可以使用如下的 term 查询:

GET /demo_operate_log_data_m202501_read/_search
{
  "query": {
    "term": {
      "user_id": "U001"
    }
  }
}

在这里插入图片描述

解释:

  • term 查询用于精确匹配字段的值。
  • 如果 user_id 在映射中被定义为 keyword 类型,那么它会按照原样进行精确匹配。

匹配查询 (match 查询)

对于文本类型的字段,match 查询能够实现更灵活的搜索。例如,我们要查询所有名字包含 “John” 的用户:

GET /demo_operate_log_data_m202501_read/_search
{
  "query": {
    "match": {
      "name": "Charlie Li"
    }
  }
}

在这里插入图片描述

解释:

  • match 查询适用于全文搜索,ES 会对文本字段进行分词后进行搜索。
  • 对于如 name 这样的文本字段,match 查询可以匹配到所有包含 “Charlie Li” 的用户,无论是名字中间、开始或结束部分。

范围查询 (range 查询)

如果我们想查询年龄在 20 到 30 岁之间的用户,可以使用 range 查询:

GET /demo_operate_log_data_m202501_read/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 20,
        "lte": 30
      }
    }
  }
}

在这里插入图片描述

解释:

  • range 查询适用于数字或日期类型字段。通过设置 gte(大于或等于)和 lte(小于或等于)来定义一个范围。
  • 该查询返回所有年龄在 20 到 30 岁之间的用户。

布尔查询 (bool 查询)

布尔查询可以将多个查询条件组合起来。假设我们要查询年龄在 20 到 30 岁之间,且性别为 “female” 的用户,可以使用 bool 查询:

GET /demo_operate_log_data_m202501_read/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "age": {
              "gte": 20,
              "lte": 30
            }
          }
        },
        {
          "term": {
            "gender": "female"
          }
        }
      ]
    }
  }
}

在这里插入图片描述

解释:

  • bool 查询结合了多个查询条件,其中must 表示条件必须满足。
  • range 查询筛选年龄,term 查询筛选性别。
  • must 可以包含任意多个查询子句,适用于复杂的多条件组合查询。

高级查询

聚合查询 (aggregations)

聚合查询允许我们对数据进行统计、分组和汇总分析。假设我们需要统计每个年龄段内的用户数量,可以使用 range 聚合查询:

GET /demo_operate_log_data_m202501_read/_search
{
  "size": 0,
  "aggs": {
    "age_groups": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "to": 18
          },
          {
            "from": 18,
            "to": 30
          },
          {
            "from": 30,
            "to": 50
          },
          {
            "from": 50
          }
        ]
      }
    }
  }
}

在这里插入图片描述

解释:

  • 该查询使用range聚合将用户的年龄划分为不同的区间,并统计每个区间内的用户数量。
  • size: 0 表示不返回文档内容,只返回聚合结果。
    若size不为0,则返回文档内容。
    在这里插入图片描述

多字段匹配查询 (multi_match 查询)

如果我们需要在多个字段上进行搜索,例如查询包含 “Charlie Li” 的用户,并且可以在 name、email 和 phone_number 等字段中匹配,我们可以使用 multi_match 查询:

GET /demo_operate_log_data_m202501_read/_search
{
  "query": {
    "multi_match": {
      "query": "Charlie",
      "fields": [
        "name",
        "email",
        "phone_number"
      ]
    }
  }
}

在这里插入图片描述

解释:

  • multi_match 查询可以在多个字段中查找与查询词匹配的文档,适用于需要在多个字段中执行类似的查询。
  • fields参数指定要查询的字段列表,query 是我们要搜索的关键词。
  • 默认情况下,multi_match 查询会在所有指定的字段中查找,只要其中一个字段包含查询词中的任意词,文档就会匹配并返回。例如,在你的查询中,如果 name 字段匹配 “Charlie”,或者 email 字段匹配 “Li”(或者两者都有),文档都会被返回。

分页查询 (from 和 size 参数)

在面对大量数据时,通常会进行分页查询,以分批次返回查询结果。假设我们要查询第 2 页的用户,每页显示 2 条记录:

GET /demo_operate_log_data_m202501_read/_search
{
  "query": {
    "match_all": {}
  }
}

GET /demo_operate_log_data_m202501_read/_search
{
  "query": {
    "match_all": {}
  },
  "from": 1,
  "size": 2
}

先验证查看全部的
在这里插入图片描述
再分页查
在这里插入图片描述

解释:

  • query -> match_all:match_all 查询会返回该索引中的所有文档。这是一种无条件匹配所有文档的查询,通常用于检索整个索引的数据。
  • from: 1:这是分页的参数之一,表示从第 2 条记录开始(从 0 开始计数)。所以会跳过第 1 条文档,返回从第 2 条文档开始的结果。
  • size: 2:这个参数控制每次查询返回的文档数量。设置为 2 表示查询会返回 2 条结果。

字段排序查询 (sort 参数)

在某些情况下,我们需要对查询结果进行排序。例如,查询最新注册的 2 个用户,可以按 register_date字段进行排序:

GET /demo_operate_log_data_m202501_read/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "register_date": {
        "order": "desc"
      }
    }
  ],
  "_source": ["user_id", "name", "register_date"]
}

GET /demo_operate_log_data_m202501_read/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "register_date": {
        "order": "desc"
      }
    }
  ],
  "size": 2
}

先验证看所有的排序
在这里插入图片描述
排序筛选前两个
在这里插入图片描述

解释:

  • sort 参数用于指定排序规则,register_date 字段按降序排列,表示返回最新注册的用户。
  • size 限制每次返回的记录数量。

模糊查询 (fuzzy 查询)

如果用户输入的查询条件可能包含拼写错误,fuzzy 查询可以帮助我们进行模糊匹配。例如,我们要查询姓氏为 “Charlie Li” 的用户,但用户可能输入 “Charlie Lixxx”:

GET /demo_operate_log_data_m202501_read/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "fuzzy": {
            "name": {
              "value": "Zhang",
              "fuzziness": "AUTO"
            }
          }
        }
      ]
    }
  }
}

在这里插入图片描述

解释:

  • bool查询:bool 查询的 should 子句意味着至少满足其中一个条件。当前查询中,只有一个模糊查询条件。
  • fuzzy 查询:fuzzy查询是用于模糊匹配的。在这里,查询目标是 name 字段,查询的关键词是 “Zhang”,模糊度为 "AUTO",即自动选择最佳的模糊度。
  • fuzziness: "AUTO":"AUTO" 表示根据字符串的长度自动选择合适的模糊度。例如,短字符串可能只会有一个字符的差异(fuzziness: 1),而较长的字符串可能允许更多的字符差异(fuzziness: 2 或更多)。

总结

  通过本篇博客,我们详细介绍了 Elasticsearch 的基础和高级查询语法。我们展示了如何使用精确匹配查询(term)、全文搜索(match)、范围查询(range)、布尔查询(bool)等技术,帮助开发者快速检索用户基础信息。同时,我们还探讨了如何进行数据统计、聚合查询、多字段匹配等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RK3588平台开发系列讲解(系统篇)Linux Kconfig的语法

文章目录 一、什么是Kconfig二、config模块三、menuconfig四、menu 和 endmenu五、choice 和 endchoice六、source七、depends on八、default九、help十、逻辑表达式沉淀、分享、成长,让自己和他人都能有所收获!😄 一、什么是Kconfig Kconfig的语法及代码结构非常简单。本博…

STM32 USB组合设备 MSC CDC

STM32 USB组合设备 MSC CDC实现 教程 教程请看大佬niu_88 手把手教你使用USB的CDCMSC复合设备(基于stm32f407) 大佬的教程很好,很详细,我调出来了,代码请见我绑定的资源 注意事项 值得注意的是: 1、 cu…

深入学习RabbitMQ的Direct Exchange(直连交换机)

RabbitMQ作为一种高性能的消息中间件,在分布式系统中扮演着重要角色。它提供了多种消息传递模式,其中Direct Exchange(直连交换机)是最基础且常用的一种。本文将深入介绍Direct Exchange的原理、应用场景、配置方法以及实践案例&a…

Node.js——path(路径操作)模块

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

【Verdi实用技巧-Part2】

Verdi实用技巧-Part2 2 Verdi实用技巧-Part22.1 Dump波形常用的task2.1.1 Frequently Used Dump Tasks2.1.2 Demo 2.2 提取波形信息小工具--FSDB Utilities2.3 Debug in Source code view2.3.1 Find Scopes By Find Scope form 2.3.2 Go to line in Souce code View2.3.3 Use B…

web-前端小实验4

实现以上图片中的内容 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用户注册</title&…

NLP项目实战——基于Bert模型的多情感评论分类(附数据集和源码)

在当今数字化的时代&#xff0c;分析用户评论中的情感倾向对于了解产品、服务的口碑等方面有着重要意义。而基于强大的预训练语言模型如 Bert 来进行评论情感分析&#xff0c;能够取得较好的效果。 在本次项目中&#xff0c;我们将展示如何利用 Python 语言结合transformers库&…

TAS测评倍智题库 | 益丰大药房2025年中高层测评BA商业推理测评真题考什么?

您好&#xff01;您已被邀请参加360评估。您的评估与反馈将有助于被评估人更深入地了解个人情况&#xff0c;发现个人优势和潜在风险。请您秉持公正、开放的心态进行评估。请尽快完成评估&#xff0c;在此衷心感谢您的配合与支持&#xff01; ​ 相关事宜&#xff1a; 请您在…

优秀的大模型会不会做坏事?

主要围绕大型语言模型&#xff08;LLMs&#xff09;在特定情境下可能出现的欺骗行为及相关研究展开&#xff0c;具体如下&#xff1a; 研究背景与核心发现&#xff1a;研究发现即使在用户无意激励的情况下&#xff0c;LLMs 也可能说谎&#xff0c;而能使用工具的模型更易被诱导…

fiscoBcos落盘加密介绍

落盘加密 落盘加密是在机构内部进行的&#xff0c;每个机构独立管理自己硬盘数据的安全。内网中&#xff0c;每个节点的硬盘数据是被加密的。所有加密数据的访问权限&#xff0c;通过Key Manager来管理。Key Manager是部署在机构内网内&#xff0c;专门管理节点硬盘数据访问秘…

完全二叉树的删除

&#xff08;1&#xff09;删除叶子节点 找到要删除的节点 targetNode找到要删除节点的父节点parent&#xff08;父节点是否存在&#xff09;要删除的节点是父节点的左子树还是右子树如果是左子树&#xff0c;则parent.leftnull;如果是右子树则parent.rightnull。 &#xff08;…

ModuleNotFoundError: No module named ‘setuptools_rust‘ 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【算法】时间复杂度以及O(N^2)的排序

目录 1.常数时间的操作 2.时间复杂度 2.1.以选择排序为例 2.2.O(n^2)从何而来 2.3.冒泡排序 2.3.1.抑或运算 2.4.插入排序 3.二分法 3.1.局部最小 4.递归 4.1.递归行为时间复杂度的估计 1.常数时间的操作 一个操作如果和样本的数据量无关&#xff0c;每次都是固定时…

uni app 写的 小游戏,文字拼图?文字拼写?不知道叫啥

从下方的偏旁部首中选在1--3个组成上面文章中的文字&#xff0c;完成的文字标红 不喜勿喷 《满江红》 其中用到了两个文件 strdata.json parameters.json 这两个文件太大 放到资源中了 资源文件 <template><view class"wenzi_page_main"><view c…

【杂记】qt

1、终端下载PySide6以转换文件格式&#xff1a;pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple 命令提示符下载完毕后&#xff1a;powerShell &#xff1a;cd 跳转到文件对应地址 &#xff08;1、pyside6-uic.exe test.ui -o test.py #将Ui界面文件转换成…

宁德时代2025年Verify入职测评语言理解及数字推理真题SHL题库汇总、考情分析

宁德时代社招Verify入职测评对薪酬有着重要影响&#xff0c;其规定正确率达到80%才能顺利通过测评。这体现了公司对人才专业素养与能力的严格要求&#xff0c;旨在筛选出真正符合岗位需求的优秀人才。测评内容涵盖了专业知识、技能运用、逻辑思维等多方面&#xff0c;只有综合能…

Jenkins-持续集成、交付、构建、部署、测试

Jenkins-持续集成、交付、构建、部署、测试 一: Jenkins 介绍1> Jenkins 概念2> Jenkins 目的3> Jenkins 特性4> Jenkins 作用 二&#xff1a;Jenkins 版本三&#xff1a;DevOps流程简述1> 持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff0…

Flink系统知识讲解之:如何识别反压的源头

Flink系统知识之&#xff1a;如何识别反压的源头 什么是反压 Ufuk Celebi 在一篇古老但仍然准确的文章中对此做了很好的解释。如果您不熟悉这个概念&#xff0c;强烈推荐您阅读这篇文章。如果想更深入、更低层次地了解该主题以及 Flink 网络协议栈的工作原理&#xff0c;这里有…

Go学习:多重赋值与匿名变量

1. 变量的多重赋值 1.1 基本语法格式 go语言中&#xff0c;可以将多个赋值语句 合并成 一句&#xff0c;比如&#xff1a; a : 10 b : 20 c : 30//a,b,c三个变量的赋值语句可以简练成以下格式a, b, c : 10, 20, 30 1.2 交换变量值 当需要交换两个变量的值时&#…

ArkUI-应用数据持久化

应用数据持久化&#xff0c;是指应用将内存中的数据通过文件或数据库的形式保存到设备上。内存中的数据形态通常是任意的数据结构或数据对象&#xff0c;存储介质上的数据形态可能是文本、数据库、二进制文件等。 HarmonyOS标准系统支持典型的存储数据形态&#xff0c;包括用户…