【DSL】ES+DSL 查询语法

这篇具有很好参考价值的文章主要介绍了【DSL】ES+DSL 查询语法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

工作中遇到ES的查询问题,由于业务方给的条件不清晰,有些查询无法实现,需要用到DSL语法查询实现,很久没用生疏了,借此机会复习下。

二、定义

1.基本介绍

Elasticsearch(简称为ES),一个开源的分布式搜索和分析引擎,主要用于处理大量数据并提供快速、实时的搜索功能。
DSL(Domain Specific Language),一种特定领域的查询语言,用于构建复杂的查询和聚合操作。

在Elasticsearch中,可用DSL语法来定义查询和过滤条件,以及执行聚合操作。
DSL语法具有JSON格式****(敲重点,要考),因此它非常易于阅读和编写。

2.语法说明
(1)关键字(Keywords)
  • DSL通常会定义一组关键字,这些关键字具有特殊含义,并在DSL中起到关键作用。关键字通常不能用作标识符或变量名。
  • 示例:在一个简单的数学表达式DSL中,可能会定义关键字如"add"、"subtract"等来表示加法和减法操作。
(2)标识符(Identifiers)
  • 标识符是用来表示变量名、函数名或其他用户定义的名称。它们需要遵循特定的命名规则,如大小写敏感、不包含特殊字符等。
  • 示例:在一个配置文件DSL中,可以使用标识符来表示不同的配置项,如"username"、"password"等。
(3)表达式(Expressions)
  • 表达式是DSL中最基本的构建块,用于计算或产生某个值。表达式可以包括变量、常量、运算符和函数调用。
  • 示例:在一个数学表达式DSL中,可以将"2 + 3"作为一个表达式,计算结果为5。
(4)运算符(Operators)
  • 运算符用于执行各种操作,例如算术运算、逻辑运算、比较运算等。DSL中的运算符根据所涉及的领域和需求而定。
  • 示例:在一个布尔表达式DSL中,可以定义逻辑运算符如"and"、"or"用于连接多个条件。
(5)函数调用(Function Calls)
  • DSL可以支持函数调用,允许用户使用预定义或自定义的函数来完成特定的任务。函数调用通常由函数名称和传递给函数的参数组成。
  • 示例:在一个日期处理DSL中,可以定义函数"formatDate(date, format)",其中"date"是日期值,"format"是日期格式字符串。
(6)控制流(Control Flow)
  • 控制流语句用于控制程序的执行流程,例如条件语句(if-else)和循环语句(while、for)等。DSL可以支持特定的控制流语句来满足领域特定需求。
  • 示例:在一个工作流程DSL中,可以使用条件语句来判断某个条件是否满足并执行相应的操作。
(7)注释(Comments)
  • 注释用于向DSL代码添加说明性文本,以便开发人员理解和维护代码。注释通常不会被编译或执行,仅用于阅读目的。
  • 示例:在DSL中,可以使用双斜杠(//)或特定的注释标记来添加注释,如:“// 这是一个示例注释”。
3.常见语法
(1)查询(Query)

用于指定搜索条件,并返回与之匹配的文档结果集。以下是一些常见的查询类型:

  • Match查询:用于根据指定字段的内容进行全文匹配。
  • Term查询:用于精确匹配某个字段的值,不进行分词。
  • Range查询:用于匹配某个范围内的值。
  • Bool查询:用于组合多个查询条件。
(2)过滤(Filter)

用于筛选满足指定条件的文档结果集。过滤器通常用于在查询结果上应用额外的限制。以下是一些常见的过滤器类型:

  • Term过滤器:用于精确匹配某个字段的值。
  • Range过滤器:用于筛选符合某个范围条件的值。
  • Bool过滤器:用于组合多个过滤条件。
(3)聚合(Aggregation)

用于对文档结果集进行分组和统计操作,从而生成各种汇总数据。聚合可以计算平均值、总和、最大值、最小值等。以下是一些常见的聚合类型:

  • Terms聚合:根据指定字段的值进行分组,并返回每个分组的文档统计信息。
  • Date Histogram聚合:按照时间间隔对文档进行分组,并返回每个时间间隔的文档统计信息。
  • Range聚合:将文档分组到不同的范围,并返回每个范围的文档统计信息。

三、示例枚举

1.单独查询

我用的ES版本为7.1.0,以下所有示例均基于这个版本,不同版本在写法上略有差异,使用时要注意喔。

(1)基本查询(Match Query)
  • 查询指定字段中匹配关键词或短语的文档。
  • 示例:查询"title"字段包含"Elasticsearch"的文档。
GET /index/_search
{
  "query": {
    "match": {
      "title": "Elasticsearch"
    }
  }
}
(2)多字段查询(Multi-match Query)
  • 在多个字段中匹配指定的关键词或短语。
  • 示例:在"title"和"content"字段中匹配"Elasticsearch"的文档。
GET /index/_search
{
  "query": {
    "multi_match": {
      "query": "Elasticsearch",
      "fields": ["title", "content"]
    }
  }
}
(3)范围查询(Range Query)
  • 根据范围条件匹配字段中的值。
  • 示例:查询价格在50到100之间的文档。
GET /index/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 50,
        "lte": 100
      }
    }
  }
}
(4)布尔查询(Bool Query)
  • 将多个查询组合为逻辑上的AND、OR或NOT关系。
  • 示例:查询标题包含"Elasticsearch"且价格大于等于50的文档。
GET /index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" } },
        { "range": { "price": { "gte": 50 } } }
      ]
    }
  }
}
(5)聚合查询(Aggregation Query)
  • 计算和统计数据集中的汇总信息。
  • 示例:计算字段"sales"的总和作为结果返回。
GET /index/_search
{
  "aggs": {
    "total_sales": {
      "sum": { "field": "sales" }
    }
  }
}
(6)排序(Sorting)
  • 对搜索结果按照指定字段进行排序。
  • 示例:按照"timestamp"字段的降序对结果进行排序。
GET /index/_search
{
  "sort": [
    { "timestamp": { "order": "desc" } }
  ]
}
(7)分页(Pagination)
  • 从搜索结果中获取特定范围的文档。
  • 示例:返回从0开始的10个文档作为结果。
GET /index/_search
{
  "from": 0,
  "size": 10,
  "query": {
    "match_all": {}
  }
}
2.组合查询

因为大部分日常使用,都是组合查询,所以在此也罗列一些组合查询的示例。

(1)组合多个must查询
  • 示例:要求标题包含"Elasticsearch"且内容包含"数据分析"的文档。
GET /index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" } },
        { "match": { "content": "数据分析" } }
      ]
    }
  }
}
(2)组合must和should查询
  • 示例:要求标题包含"Elasticsearch"且(价格大于等于50或评分高于4)的文档。
GET /index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" } }
      ],
      "should": [
        { "range": { "price": { "gte": 50 } } },
        { "range": { "rating": { "gt": 4 } } }
      ]
    }
  }
}
(3)组合must和must_not查询
  • 示例:要求标题包含"Elasticsearch"且不包含"教程"的文档。
GET /index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" } }
      ],
      "must_not": [
        { "match": { "title": "教程" } }
      ]
    }
  }
}
(4)组合多个should查询
  • 示例:要求标题包含"Elasticsearch"或内容包含"数据分析"或作者是"John"的文档。
GET /index/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title": "Elasticsearch" } },
        { "match": { "content": "数据分析" } },
        { "match": { "author": "John" } }
      ]
    }
  }
}
(5)嵌套组合查询
  • 示例:要求标题包含"Elasticsearch"且(价格大于等于50或评分高于4)且(内容包含"搜索引擎"或标签是"技术")的文档。
GET /index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" } }
      ],
      "should": [
        { "range": { "price": { "gte": 50 } } },
        { "range": { "rating": { "gt": 4 } } }
      ],
      "minimum_should_match": 1,
      "filter": [
        { "match": { "content": "搜索引擎" } },
        { "terms": { "tags": ["技术"] } }
      ]
    }
  }
}
  • 将多个查询组合使用bool查询的must、should或must_not子句。
  • 示例:查询标题包含"Elasticsearch"且(价格大于等于50或评分高于4)的文档。
GET /index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" } },
        {
          "bool": {
            "should": [
              { "range": { "price": { "gte": 50 } } },
              { "range": { "rating": { "gt": 4 } } }
            ]
          }
        }
      ]
    }
  }
}

四、总结

对技术的态度还是那句话:只有不断学习才能不断进步,在此也推荐一些关于ES+DSL的主题文章,可以参考学习:

  1. “Getting Started with Elasticsearch: A Complete Guide” by Elastic:这篇文章是Elastic官方提供的入门指南,涵盖了Elasticsearch的基本概念、安装和配置,以及常见的用例和查询示例。
  2. “Introduction to Domain-Specific Languages” by Martin Fowler:这是Martin Fowler撰写的一篇关于领域特定语言的介绍性文章。它解释了什么是DSL,为什么使用DSL以及如何设计和实现DSL。
  3. “Creating Domain-Specific Languages with Xtext” by Lars Vogel:这篇文章介绍了使用Xtext开发领域特定语言的方法。它探讨了Xtext的基本概念、工作流程和示例,帮助您开始构建自己的DSL。
  4. “Building Domain-Specific Languages in Python” by Andrew Dalke:这篇文章介绍了在Python中构建领域特定语言的方法。它包含了一些库和工具的示例,可以帮助您在Python项目中实现自定义DSL。

以上是梳理总结的一些关于ES+DSL 查询语法学习的内容,希望能帮到大家, 如有错误,欢迎指正。
原创不易,转载请注意出处:
https://blog.csdn.net/weixin_41613094/article/details/131578855文章来源地址https://www.toymoban.com/news/detail-529303.html

到了这里,关于【DSL】ES+DSL 查询语法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch - DSL查询文档语法,以及深度分页问题、解决方案

    目录 一、DSL 查询文档语法 前言 1.1、DSL Query 基本语法 1.2、全文检索查询 1.2.1、match 查询 1.2.2、multi_match 1.3、精确查询 1.3.1、term 查询 1.3.2、range 查询 1.4、地理查询 1.4.1、geo_bounding_box 1.4.2、geo_distance 1.5、复合查询 1.5.1、相关性算分 1.5.2、function_score 1.5.3、boolean query 1.6、搜索

    2024年02月07日
    浏览(51)
  • 【ElasticSearch-基础篇】ES高级查询Query DSL全文检索

    和术语级别查询(Term-Level Queries)不同,全文检索查询(Full Text Queries)旨在 基于相关性搜索和匹配文本数据 。这些查询会对输入的文本进行分析,将其 拆分 为词项(单个单词),并执行诸如分词、词干处理和标准化等操作。 全文检索的关键特点: 对输入的文本进行分析

    2024年01月22日
    浏览(53)
  • 【ElasticSearch-基础篇】ES高级查询Query DSL术语级别查询并结合springboot使用

    Elasticsearch 提供了基于 JSON 的完整 Query DSL(Domain Specific Language)来定义查询。 因Query DSL是利用Rest API传递JSON格式的请求体(RequestBody)数据与ES进行交互,所以我们在使用springboot的时候也可以很方便的进行集成,本文主要讲述的就是使用springboot实现各类DSL的语法查询。 Elastics

    2024年02月01日
    浏览(53)
  • elasticsearch[二]-DSL查询语法:全文检索、精准查询(term/range)、地理坐标查询(矩阵、范围)、复合查询(相关性算法)、布尔查询

    elasticsearch 的查询依然是基于 JSON 风格的 DSL 来实现的。 Elasticsearch 提供了基于 JSON 的 DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有 :查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查询 :利用分词器对用户输入内容分词,然后去

    2024年01月18日
    浏览(60)
  • 【Elasticsearch】 10-DSL语法详解-复合查询bool(must、should、must_not、filter)

    Elasticsearch是一个强大的搜索引擎,它提供了丰富的查询功能,以帮助你从大规模数据集中检索相关的文档。在Elasticsearch中, bool 查询是一个非常重要和强大的工具,它允许组合多个查询子句,以构建复杂的查询逻辑。在本篇文章中,我们将深入探讨 bool 查询,包括其概述、

    2024年02月05日
    浏览(43)
  • DB SQL 转 ES DSL(支持多种数据库常用查询、统计、平均值、最大值、最小值、求和语法)...

    1. 简介   日常开发中需要查询 Elasticsearch 中的数据时,一般会采用 RestHighLevelClient 高级客户端封装的API。项目中一般采用一种或多种关系型数据库(如: Mysql 、 PostgreSQL 、 Oracle 等) + NoSQL(如: Elasticsearch )存储方案;不同关系数据库可以采用 Mybatis-Plus 方案屏蔽数据库的方言

    2024年01月17日
    浏览(51)
  • 【DSL】ES+DSL 查询语法

    一、前言 工作中遇到ES的查询问题,由于业务方给的条件不清晰,有些查询无法实现,需要用到DSL语法查询实现,很久没用生疏了,借此机会复习下。 二、定义 1.基本介绍 Elasticsearch(简称为ES ),一个开源的分布式搜索和分析引擎,主要用于处理大量数据并提供快速、实时

    2024年02月12日
    浏览(45)
  • ES高级查询语法DSL实战 - 第504篇

    历史文章( 文章 累计500+) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《国内最全的Spring Boot系列之七》 E

    2024年04月27日
    浏览(49)
  • ElasticSearch DSL语法

    一、文档批量操作 1.批量获取文档数据 批量获取文档数据是通过_mget的API来实现的 (1)在URL中不指定index和type 请求方式:GET 请求地址:_mget 功能说明 : 可以通过ID批量获取不同index和type的数据 请求参数: docs : 文档数组参数 _index : 指定index _type : 指定type(7.x的版本不推荐使

    2024年03月16日
    浏览(40)
  • sql语句转为es查询条件(elasticsearch-sql使用)

    github源码地址: https://gitee.com/weiyxiong_admin/elasticsearch-sql/blob/master/src/test/java/org/nlpcn/es4sql/ExplainTest.java 1、添加pom.xml依赖 2、scala 将sql转为es查询json语句 3、测试 4、查询返回结果展示(即步骤三esJSON结果打印) 5、打开postman

    2024年02月13日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包