前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >深入解析:ElasticSearch Query 查询方式

深入解析:ElasticSearch Query 查询方式

原创
作者头像
喵手
发布2025-01-09 08:47:54
发布2025-01-09 08:47:54
1890
举报
文章被收录于专栏:Java实践Java实践

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区: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 查询示例

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

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

示例:控制匹配度(minimum_should_match)

代码语言:json
复制
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 的文档

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

匹配多个值

代码语言:json
复制
GET /my_index/_search
{
  "query": {
    "terms": {
      "status": ["active", "pending"]
    }
  }
}
  • 匹配 statusactivepending 的文档。

3. Bool 查询(组合查询)

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

3.1 Bool 查询示例

同时满足多条件的查询

代码语言:json
复制
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 之间的商品

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

查询过去 7 天的数据

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

5. Aggregation 查询(聚合查询)

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

5.1 聚合查询示例

按分类统计商品数量

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

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

代码语言:json
复制
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 的文档

代码语言:sql
复制
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 !!!

***

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

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。


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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 摘要
  • 概述
  • 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 查询示例
  • 适用场景案例
  • 优缺点分析
    • 优点
    • 缺点
  • 小结
  • 总结
  • 文末
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档