当前位置: 首页 > article >正文

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)等技术,帮助开发者快速检索用户基础信息。同时,我们还探讨了如何进行数据统计、聚合查询、多字段匹配等。


http://www.kler.cn/a/488128.html

相关文章:

  • oracle闪回表
  • Erlang语言的网络编程
  • k8s的原理和,k8s的安装
  • Kivy,跨平台UI的艺术家
  • web服务器快速目录搜索遍历工具推荐:Dirsearch
  • 【Linux】模拟Shell命令行解释器
  • flowable mysql 表名大小写问题
  • 【经典神经网络架构解析篇】【1】LeNet网络详解:模型结构解析、优点、实现代码
  • Android 系统签名 keytool-importkeypair
  • 解决anaconda prompt找不到的情况
  • STM32F767+LWIP+CubeMX配置中断模式
  • 【C++经典例题】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句
  • 【LeetCode】每日一题 2024_1_10 统计重新排列后包含另一个字符串的子字符串数目 II(滑动窗口)
  • 10-pyecharts绘图
  • Spring bean的生命周期和扩展
  • 践行“金融为民” 平安养老险迎来理赔新篇章
  • 使用Postman实现API自动化测试
  • 【股票数据API接口02】如何获取股票历史交易数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • 基于QT和C++的实时日期和时间显示
  • Vue2:el-table中的文字根据内容改变颜色
  • Spring——自动装配
  • C++笔记之`size_t`辨析
  • Untiy中如何嵌入前端页面,从而播放推流视频?
  • Colossal-AI:深度学习大规模分布式训练框架
  • 光伏风电新技术进展:迈向能源新时代
  • 如何在 Ubuntu 22.04 上安装和配置邮件服务器教程