深入解析:ElasticSearch Query 查询方式

devtools/2025/4/1 19:24:42/

全文目录:

    • 开篇语
    • 前言
    • 摘要
    • 概述
    • ElasticSearch Query 查询方式详解
      • 1. Match 查询(全文搜索)
        • 1.1 Match 查询示例
        • 1.2 Match 查询参数扩展
      • 2. Term 查询(精准查询)
        • 2.1 Term 查询示例
        • 2.2 Terms 查询
      • 3. Bool 查询(组合查询)
        • 3.1 Bool 查询示例
      • 4. Range 查询(范围查询)
        • 4.1 Range 查询示例
        • 4.2 日期范围查询
      • 5. Aggregation 查询(聚合查询)
        • 5.1 聚合查询示例
        • 5.2 聚合扩展:嵌套聚合
      • 6. SQL 查询(简化语法)
        • SQL 查询示例
    • 适用场景案例
    • 优缺点分析
      • 优点
      • 缺点
    • 小结
    • 总结
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在上期内容中,我们深入探讨了 ElasticSearch 的基本架构和核心功能,包括分布式存储、分片与副本的工作机制以及倒排索引的实现原理。然而,在实际的开发场景中,仅仅理解这些基础知识是不够的。我们需要通过查询接口高效地从海量数据中获取我们需要的信息。

本期内容,我们将聚焦 ElasticSearch 的 Query 查询方式。ElasticSearch 提供了丰富的查询 DSL(Domain Specific Language),可以满足从简单的全文搜索到复杂条件查询的多样化需求。通过对查询方式的解析和实战案例分享,我们将全面掌握 ElasticSearch 的查询能力。


摘要

ElasticSearch 是一个分布式搜索和分析引擎,其强大的查询功能使其成为处理海量数据的利器。本篇文章将系统讲解 ElasticSearch 的查询方式,包括 全文搜索结构化查询组合查询聚合查询 等,同时结合实际场景演示如何高效构建查询语句。最后,我们会对不同查询方式的优缺点进行对比,并总结最佳实践。


概述

ElasticSearch 提供两种主要的查询方式:

  • 查询 DSL(Query DSL):基于 JSON 格式的查询语法,用于表达搜索条件。
  • SQL 查询:ElasticSearch 提供了类似 SQL 的查询接口,适合习惯使用 SQL 的开发者。

在开发中,Query DSL 是主要的查询方式,它分为以下两大类:

  1. Match Queries(匹配查询):主要用于全文搜索。
  2. Term Queries(精准查询):用于精确匹配结构化数据。

除此之外,还可以通过组合查询和聚合查询实现复杂数据分析。


ElasticSearch Query 查询方式详解

1. Match 查询(全文搜索)

Match 查询是 ElasticSearch 中用于 全文搜索 的主要方式,它会对查询条件进行分词,然后匹配分词后的结果。

1.1 Match 查询示例

查询字段中包含某关键词的文档

GET /my_index/_search
{"query": {"match": {"content": "elastic search"}}
}
  • 解析
    • 查询字段 content
    • 查询内容 elastic search 会被分词为 elasticsearch,然后进行匹配。
1.2 Match 查询参数扩展

示例:控制匹配度(minimum_should_match)

GET /my_index/_search
{"query": {"match": {"content": {"query": "elastic search","minimum_should_match": "75%"}}}
}
  • minimum_should_match:至少 75% 的词语需要匹配,适合宽松搜索。

2. Term 查询(精准查询)

Term 查询不会对输入内容进行分词,直接用于匹配精确的值(例如数字、日期、布尔值等)。

2.1 Term 查询示例

查询状态为 active 的文档

GET /my_index/_search
{"query": {"term": {"status": "active"}}
}
  • 解析
    • 查询字段 status
    • 匹配字段值为 active 的文档。
2.2 Terms 查询

匹配多个值

GET /my_index/_search
{"query": {"terms": {"status": ["active", "pending"]}}
}
  • 匹配 statusactivepending 的文档。

3. Bool 查询(组合查询)

Bool 查询是 ElasticSearch 的 核心查询,用于构建复杂的条件查询。它允许组合多个子查询,通过逻辑关系(mustshouldmust_not)实现。

3.1 Bool 查询示例

同时满足多条件的查询

GET /my_index/_search
{"query": {"bool": {"must": [{ "term": { "status": "active" }},{ "match": { "content": "elastic search" }}],"must_not": [{ "term": { "category": "deprecated" }}],"should": [{ "term": { "priority": "high" }}]}}
}
  • must:必须满足的条件(类似 AND)。
  • must_not:必须不满足的条件(类似 NOT)。
  • should:可选条件(类似 OR,影响匹配评分)。

4. Range 查询(范围查询)

Range 查询用于匹配数值、日期等范围数据。

4.1 Range 查询示例

查询价格在 100 到 500 之间的商品

GET /my_index/_search
{"query": {"range": {"price": {"gte": 100,"lte": 500}}}
}
  • gte:大于等于(greater than or equal)。
  • lte:小于等于(less than or equal)。
4.2 日期范围查询

查询过去 7 天的数据

GET /my_index/_search
{"query": {"range": {"timestamp": {"gte": "now-7d/d","lt": "now/d"}}}
}
  • now:当前时间。
  • d:按天计算。

5. Aggregation 查询(聚合查询)

Aggregation(聚合查询)用于对数据进行统计分析,例如求平均值、总和、分组等。

5.1 聚合查询示例

按分类统计商品数量

GET /my_index/_search
{"size": 0,"aggs": {"category_count": {"terms": {"field": "category.keyword"}}}
}
  • size: 0:不返回文档,只返回聚合结果。
  • terms:按分类字段分组。
5.2 聚合扩展:嵌套聚合

统计每个分类下的平均价格

GET /my_index/_search
{"size": 0,"aggs": {"categories": {"terms": {"field": "category.keyword"},"aggs": {"avg_price": {"avg": {"field": "price"}}}}}
}

6. SQL 查询(简化语法)

ElasticSearch 提供了 SQL 查询接口,便于使用 SQL 风格查询数据。

SQL 查询示例

查询状态为 active 的文档

POST /_sql?format=json
{"query": "SELECT * FROM my_index WHERE status = 'active'"
}

适用场景案例

  1. 电商平台

    • 使用 Match 查询实现商品的关键词搜索。
    • 使用 Aggregation 查询统计每个分类下商品的数量。
  2. 日志分析系统

    • 使用 Range 查询分析过去一周的访问量。
    • 使用 Bool 查询过滤多个条件的日志。
  3. 数据统计系统

    • 使用 Terms 和 Aggregation 查询统计各地销售额分布。

优缺点分析

优点

  1. 灵活性强:支持丰富的查询类型,适配不同需求。
  2. 性能高效:通过倒排索引和聚合优化实现快速查询。
  3. 扩展性好:支持组合查询和嵌套聚合。

缺点

  1. 学习曲线陡峭:查询 DSL 的复杂度较高。
  2. 调试难度大:复杂查询可能需要反复测试优化。

小结

通过本文的学习,我们系统了解了 ElasticSearch 的查询方式,包括全文搜索、精确匹配、范围查询、组合查询以及聚合查询等。无论是构建搜索引擎,还是设计复杂的数据统计功能,ElasticSearch 都提供了强大的工具链。


总结

ElasticSearch 的强大查询能力是其成为现代分布式搜索和分析引擎的核心优势。在实际项目中,通过合理选择和组合查询方式,可以高效地从海量数据中获取所需信息。希望本篇文章能为您在 ElasticSearch 查询开发中提供切实的帮助和启发!

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!


http://www.ppmy.cn/devtools/172472.html

相关文章

基于springboot+vue的农产品电商平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

大模型提示词-模型四 (Grok-1、LLaMA与Mistral 7B模型对比)-(专题6)

1. 模型提示指南 1.1 Grok-1 Grok-1 是一个混合专家(MoE)大型语言模型(LLM),具有 3140 亿个参数,包括基础模型权重和网络架构的公开发布。 Grok-1 由 xAI 训练,并由 MoE 模型组成,在推理时对每个标记激活 25% 的权重。Grok-1 的预训练截止日期为 2023 年 10 月。 根…

算力盒子VS边缘计算盒子

算力盒子是一种集成了高性能计算能力的边缘计算设备,通常用于处理复杂的计算任务,尤其是在人工智能(AI)和深度学习领域。 应用场景: ‌智慧城市‌:用于多路高清视频的实时分析和处理,支持人、…

基于YALMIP+CPLEX的带储能微电网调度问题最优求解matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 1.YALMIP简介 2.CPLEX简介 3.基于YALMIPCPLEX的求解步骤 5.完整工程文件 1.课题概述 微电网作为分布式能源系统的核心组成部分,其优化调度是实现能源高效利用和经济运行的关键。传统的微电…

gdb 调试mysql

gdb 调试mysql,这里调试 用户登陆报错 窗口1 用gdb 挂住 my_error 函数 [rootnode1 ~]# ps -ef|grep mysql root 4688 1 0 Mar22 ? 00:00:00 /bin/sh /usr/local/mysql//bin/mysqld_safe --datadir/data/mysql/mysql3306/data --pid-file/data/mysql/mysql3…

Postman 如何发送 Post 请求上传文件? 全面指南

写一个后端接口,肯定离不开后续的调试,所以我使用了 Postman 来进行上传图片接口的调试,调试步骤也很简单: 第一步:填写请求 URL第二步:选择请求类型第三步:选择发送文件第四步:点击…

大模型最新面试题系列:微调篇之微调框架(二)

一、 解释DeepSpeed的混合精度训练(FP16/FP8)配置参数,如fp16.enabled fp16.enabled 作用:该参数用于启用或禁用FP16混合精度训练。当设置为True时,DeepSpeed将使用FP16数据类型进行模型训练,以减少内存占…

清晰易懂的Cursor实现AI编程从安装到实战TodoList开发

一、Cursor简介与安装部署 什么是Cursor? Cursor是一款基于AI的智能代码编辑器,它集成了强大的AI编程助手功能,能够通过自然语言交互帮助开发者生成、优化和调试代码。与传统的代码编辑器不同,Cursor可以理解你的编程意图&#…