【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的主题文章,可以参考学习:
- “Getting Started with Elasticsearch: A Complete Guide” by Elastic:这篇文章是Elastic官方提供的入门指南,涵盖了Elasticsearch的基本概念、安装和配置,以及常见的用例和查询示例。
- “Introduction to Domain-Specific Languages” by Martin Fowler:这是Martin Fowler撰写的一篇关于领域特定语言的介绍性文章。它解释了什么是DSL,为什么使用DSL以及如何设计和实现DSL。
- “Creating Domain-Specific Languages with Xtext” by Lars Vogel:这篇文章介绍了使用Xtext开发领域特定语言的方法。它探讨了Xtext的基本概念、工作流程和示例,帮助您开始构建自己的DSL。
- “Building Domain-Specific Languages in Python” by Andrew Dalke:这篇文章介绍了在Python中构建领域特定语言的方法。它包含了一些库和工具的示例,可以帮助您在Python项目中实现自定义DSL。
以上是梳理总结的一些关于ES+DSL 查询语法学习的内容,希望能帮到大家, 如有错误,欢迎指正。
原创不易,转载请注意出处:
https://blog.csdn.net/weixin_41613094/article/details/131578855
相关文章:
【DSL】ES+DSL 查询语法
【DSL】ESDSL 查询语法 一、前言二、定义1.基本介绍2.语法说明(1)关键字(Keywords)(2)标识符(Identifiers)(3)表达式(Expressions)(4)运算符(Operators)(5)函…...
Vue第三篇:最简单的vue购物车示例
本文参考:Vue Cli(脚手架)实现购物车小案例 - - php中文网博客 效果图: 编写流程: 1、首先通过vue/cli创建工程 vue create totalprice 2、改写App.vue代码如下: <template><div><div v…...
MFC 基于数据库的管理系统
文章目录 初始化设置菜单 添加数据库类创建数据库配置数据库 全部代码 初始化 创建文件选择基于CListView 初始化数据 public:CListCtrl& m_list;CSQLView::CSQLView() noexcept:m_list(GetListCtrl()) {// TODO: 在此处添加构造代码}void CSQLView::OnInitialUpdate() {C…...
EfficientNet论文笔记
EfficientNet论文笔记 通过NAS平衡了channel,depth,resolution,发现在相同的FLOPs下,同时增加 depth和 resolution的效果最好。 数据集效果小于resolution怎么办? EfficientNet—b0框架 表格中每个MBConv后会跟一个…...
系统学习Linux-SSH远程服务(二)
概念 安全外壳协议,提供安全可靠的远程连接 特点 ssh是工作在传输层和应用层的协议 ssh提供了一组管理命令 ssh 远程登陆 scp 远程拷贝 sftp 远程上传下载 ssh-copy-id ssh keygen 生成 提供了多种身份验证机制 身份验证机制 密码验证 需要提供密码 密…...
PyTorch训练RNN, GRU, LSTM:手写数字识别
文章目录 pytorch 神经网络训练demoResult参考来源 pytorch 神经网络训练demo 数据集:MNIST 该数据集的内容是手写数字识别,其分为两部分,分别含有60000张训练图片和10000张测试图片 图片来源:https://tensornews.cn/mnist_intr…...
基于深度学习的高精度道路瑕疵检测系统(PyTorch+Pyside6+YOLOv5模型)
摘要:基于深度学习的高精度道路瑕疵(裂纹(Crack)、检查井(Manhole)、网(Net)、裂纹块(Patch-Crack)、网块(Patch-Net)、坑洼块&#x…...
【裸辞转行】是告别,也是新的开始
一年多了没有更新,是因为去年身体加心理因素辞职了,并且大概率不会再做程序员了,嗯。本来觉得可能再也不会打开 CSDN 了,想了想,还是来做个告别吧,任何事情都该有始有终才对。 回忆碎碎念 是在去年的 11 …...
了解交换机接口的链路类型(access、trunk、hybrid)
上一个章节中讲到了vlan的作用及使用,这篇了解一下交换机接口的链路类型和什么情况下使用 vlan在数据包中是如何体现的,在上一篇的时候提到测试了一下,从PC1去访问PC4的时候,只从E0/0/2发送给了E0/0/3这是,因为两个接…...
Android系统启动流程分析
当按下Android系统的开机电源按键时候,硬件会触发引导芯片,执行预定义的代码,然后加载引导程序(BootLoader)到RAM,Bootloader是Android系统起来前第一个程序,主要用来拉起Android系统程序,Android系统被拉起…...
如何在Ubuntu上安装OpenneBula
OpenNebula是一个开源云计算平台,允许我们在完全虚拟化云中组合和管理VMware和KVM虚拟机 第1步:安装MariaDB数据库服务器 OpenNebula还需要一个数据库服务器来存储其内容。 安装MariaDB: 1 2 sudo apt update sudo apt install mariadb-s…...
解决MySQL中分页查询时多页有重复数据,实际只有一条数据的问题
0 前言 有一个离奇的BUG,在查询时,第一页跟第二页有一个共同的数据。有的数据却不显示。 后来发现是在SQL排序时没用主键排序。 解决:使用主键排序 以下是我准备的举例,可以自己试试。 1 数据准备 SET NAMES utf8mb4; SET FORE…...
【数据结构】时间复杂度---OJ练习题
目录 🌴时间复杂度练习 📌面试题--->消失的数字 题目描述 题目链接:面试题 17.04. 消失的数字 🌴解题思路 📌思路1: malloc函数用法 📌思路2: 📌思路3&…...
京东自动化功能之商品信息监控是否有库存
这里有两个参数,分别是area和skuids area是地区编码,我这里统计了全国各个区县的area编码,用户可以根据实际地址进行构造skuids是商品的信息ID填写好这两个商品之后,会显示两种状态,判断有货或者无货状态,详情如下图所示 简单编写下python代码,比如我们的地址是北京市…...
【SwitchyOmega】SwitchyOmega 安装及使用
文章目录 安装教程使用教程 安装教程 SwitchyOmega 谷歌商店下载链接:https://chrome.google.com/webstore/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif?hlen-US 在谷歌商店搜索 SwitchyOmega, 选择 Proxy SwitchyOmega 点击 Add t…...
CentOS5678 repo源 地址 阿里云开源镜像站
CentOS5678 repo 地址 阿里云开源镜像站 https://mirrors.aliyun.com/repo/ CentOS-5.repo https://mirrors.aliyun.com/repo/Centos-5.repo [base] nameCentOS-$releasever - Base - mirrors.aliyun.com failovermethodpriority baseurlhttp://mirrors.aliyun.com/centos/$r…...
【LLM】Langchain使用[二](模型链)
文章目录 1. SimpleSequentialChain2. SequentialChain3. 路由链 Router Chain Reference 1. SimpleSequentialChain 场景:一个输入和一个输出 from langchain.chat_models import ChatOpenAI #导入OpenAI模型 from langchain.prompts import ChatPromptTempla…...
简单机器学习工程化过程
1、确认需求(构建问题) 我们需要做什么? 比如根据一些输入数据,预测某个值? 比如输入一些特征,判断这个是个什么动物? 这里我们要可以尝试分析一下,我们要处理的是个什么问题&…...
【MongoDB】SpringBoot整合MongoDB
【MongoDB】SpringBoot整合MongoDB 文章目录 【MongoDB】SpringBoot整合MongoDB0. 准备工作1. 集合操作1.1 创建集合1.2 删除集合 2. 相关注解3. 文档操作3.1 添加文档3.2 批量添加文档3.3 查询文档3.3.1 查询所有文档3.3.2 根据id查询3.3.3 等值查询3.3.4 范围查询3.3.5 and查…...
关于游戏引擎(godot)对齐音乐bpm的技术
引擎默认底层 1. _process(): 每秒钟调用60次(无限的) 数学 1. bpm1分钟节拍数量60s节拍数量 bpm120 60s120拍 2. 每拍子时间 60/bpm 3. 每个拍子触发周期所需要的帧数 每拍子时间*60(帧率) 这个是从帧数级别上对齐拍子的时间&#x…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
