【DSL】ES+DSL 查询语法

【DSL】ES+DSL 查询语法

      • 一、前言
      • 二、定义
        • 1.基本介绍
        • 2.语法说明
          • (1)关键字(Keywords)
          • (2)标识符(Identifiers)
          • (3)表达式(Expressions)
          • (4)运算符(Operators)
          • (5)函数调用(Function Calls)
          • (6)控制流(Control Flow)
          • (7)注释(Comments)
        • 3.常见语法
          • (1)查询(Query)
          • (2)过滤(Filter)
          • (3)聚合(Aggregation)
      • 三、示例枚举
        • 1.单独查询
          • (1)基本查询(Match Query)
          • (2)多字段查询(Multi-match Query)
          • (3)范围查询(Range Query)
          • (4)布尔查询(Bool Query)
          • (5)聚合查询(Aggregation Query)
          • (6)排序(Sorting)
          • (7)分页(Pagination)
        • 2.组合查询
          • (1)组合多个must查询
          • (2)组合must和should查询
          • (3)组合must和must_not查询
          • (4)组合多个should查询
          • (5)嵌套组合查询
      • 四、总结

一、前言

工作中遇到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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

socket编程代码示例

1. TCP server client模拟聊天对话框 server.c /* server.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #include &l…

Docker

Docker 一、Docker 简介1.1 Docker 概述1.2 Docker1.3 Docker 受欢迎的原因1.4 Docker 与 openstack&#xff08;虚拟机&#xff09; 的区别1.5 Docker核心概念 二、安装 Docker三、Docker 命令四、Docker 镜像操作五、Docker 容器操作 一、Docker 简介 1.1 Docker 概述 Dock…

SpringBoot + Docker 实现一次构建到处运行

一、容器化部署的好处 Docker 作为一种新兴的虚拟化方式&#xff0c;它可以更高效的利用系统资源&#xff0c;不需要进行硬件虚拟以及运行完整操作系统等额外开销。 传统的虚拟机技术启动应用服务往往需要数分钟&#xff0c;而 Docker 容器应用&#xff0c;由于直接运行宿主内…

Vue第二篇:概念深度剖析

参考链接&#xff1a;https://www.bilibili.com/video/BV1oj411D7jk/?spm_id_from333.788.recommend_more_video.0&vd_source3969f30b089463e19db0cc5e8fe4583a 1、响应式数据与插值表达式理解 前端最基本的操作是&#xff1a;把数据呈现到页面上&#xff0c;把更新的数据…

AI绘画创意文字全流程揭秘,你的终极文字艺术实操宝典

本教程收集于&#xff1a;AIGC从入门到精通教程汇总 AIGC技术不断更新迭代&#xff0c;国内出现了越来越多的新玩法&#xff0c;比如最近大家都在热议的AI绘画创意文字。 过去的一周&#xff0c;我把这些新玩法都研究了一遍&#xff0c;并总结了一套完整的制作流程。 主流的…

python+allure+jenkins

目录 前言 在 python 中使用 allure 1. 安装 pytest 2. 安装 pytest-allure-adaptor 3. 使用 pytest 执行测试用例并生成 allure 中间报告&#xff08;此步骤可以省略&#xff0c;因为在 jenkins job 中会配置执行类似的命令&#xff09; 4. Jenkins 中安装Allure Jenkin…

LED魔方屏的应用特点、适用场景跟应用优势

led魔方屏也被称之为立方体led显示屏、六面体led显示屏等&#xff0c;每个显示面之间实现了无缝拼接&#xff0c;运用技术前沿的箱体设计工艺&#xff0c;通过跟实际安装场景相结合&#xff0c;打造出更具创意的led显示屏产品&#xff0c;led魔方屏以独特的造型吸引用户&#x…

【ARM Coresight 系列文章 10.1 - ARM Coresight STM 介绍及使用】

文章目录 Guaranteed and invariant timing transactionsMultiple STPv2 master support 上篇文章&#xff1a;ARM Coresight 系列文章 10 - ARM Coresight STM 介绍及使用 Guaranteed and invariant timing transactions STM 支持两种类型的软件的数据&#xff0c;一种是 gua…

SpringCloud学习路线(3)—— Eureka注册中心

一、导引 服务调用出现的问题 服务调用采取的请求地址是静态的&#xff0c;当我们使用服务集群时&#xff0c;很容易造成只能调用固定的微服务上的接口。多个提供者&#xff0c;消费者的使用对象无法确定消费者无法得知提供者的状态 二、Eureka注册中心 &#xff08;一&…

【C#】并行编程实战:使用并发集合

在上一章的并行编程实现里&#xff0c;为了保护资源&#xff0c;我们对共享资源加锁&#xff08;各种同步原语&#xff09;来进行保护&#xff0c;避免多线程同时访问&#xff08;主要是写入&#xff09;。但一般来说&#xff0c;共享资源是一个可以由多个线程读写的集合&#…

JVM系列(8)——对象的内存布局

1、对象的创建过程 加载-验证-准备-解析-初始化-申请内存-成员变量赋初始值-加载构造方法。 前半段是JVM系列&#xff08;5&#xff09;——类加载过程&#xff0c;申请内存可参考&#xff1a;JVM系列&#xff08;3&#xff09;——内存分配与回收策略。 2、对象在内存中的存…

华为申请注册盘古大模型商标;京东推出言犀大模型,率先布局产业应用

7月14日科技新闻早知道&#xff0c;一分钟速览。 1.华为申请注册盘古大模型商标&#xff1a; 据天眼查 App 显示&#xff0c;7 月 7 日&#xff0c;华为技术有限公司申请注册“华为云盘古”、“Huawei Cloud Pangu Models”文字及图形商标&#xff0c;国际分类为网站服务、社…

常用API学习06(Java)

Biglnteger public BigInteger(int num, Random rnd) 获取随机大整数&#xff0c;范围&#xff1a;[0~2的num次方-1] public BigInteger(String val) 获取指定的大整数 public BigInteger(String val, int radix) 获取指定进制的大整数 public static BigInteg…

「深度学习之优化算法」(十四)麻雀搜索算法

1. 麻雀搜索算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   麻雀搜索算法(sparrow search algorithm)是根据麻雀觅食并逃避捕食者的行为而提出的群智能优化算法。提出时间是2020年,相关的论文和研究还比较少,有可能还有一些正在发表中,受疫情影响需要论…

【Android关键字】startActivityForResult/onActivityResult/setResult方法的使用

最近在写一个安卓程序&#xff0c;在程序里需要用到startActivityForResult这个Intent操作关键字&#xff0c;与该关键字有关的还有onActivityResult和setResult。这里对其用法进行一个总结。 三者在API中的形式 //startActivityForResult与startActivity类似&#xff0c;只不…

C++:const修饰指针

const修饰符常常需要在c中使用到&#xff0c;需要注意到他对于指针修饰的时候的不同区别。 #include<iostream> using namespace std; int main() {//1.const修饰指针int a 10;int b 10;const int* p &a;//指针指向的值不可以改&#xff0c;指针的指向可以改// …

2023最新ChatGPT商业运营网站源码+支持ChatGPT4.0+新增GPT联网功能+支持ai绘画+实时语音识别输入+用户会员套餐+免费更新版本

2023最新ChatGPT商业运营网站源码支持ChatGPT4.0新增GPT联网功能支持ai绘画实时语音识别输入用户会员套餐免费更新版本 一、AI创作系统二、系统程序下载三、系统介绍四、安装教程五、主要功能展示六、更新日志 一、AI创作系统 提问&#xff1a;程序已经支持GPT3.5、GPT4.0接口…

Matlab学习笔记

1.入门 1.1矩阵与运算 a[1 2 3;4 5 6;7 8 9] *表示矩阵乘法 .* .^之类则是对矩阵每个元素运算&#xff08;点乘&#xff09; inv(a)矩阵的逆 format long/short 显示更多/更少位小数 串联 A[a a] 横着 [a;a] 竖着 sum(A)会得到各列的和&#xff08;得到行向量&#xff09; …

MyBatis基础知识

文章目录 Mybatis简介MyBatis历史MyBatis特性MyBatis下载和其它持久化层技术对比 搭建MyBatis开发环境创建maven工程创建MyBatis的核心配置文件创建mapper接口创建MyBatis的映射文件通过junit测试功能加入log4j日志功能 核心配置文件详解默认的类型别名MyBatis的增删改查MyBati…

Java常见面试题

文章目录 一、Java基础面试题二、面向对象编程面试题三、集合框架面试题四、多线程面试题五、数据库面试题六、异常处理面试题七、设计模式面试题八、Spring相关面试题九、性能优化面试题十、Java 8新特性面试题十一、JVM相关面试题十二、框架相关面试题十三、并发编程面试题十…