ElasticSearch核心之DSL查询语句实战

什么是DSL?
Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。 DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。目前常用的框架查询方法什么的底层都是构建DSL语句实现的,所以你必须掌握DSL。
例如:
GET book/_search
{"query": {"match": {"name": "活着"}}
}
准备测试数据
请参考我的另一篇文章:https://blog.csdn.net/IndexMan/article/details/140611813
#精确查询
也就是term查询不会分析查询条件,只有当词条和查询字符串完全匹配时才匹配,也就是精确查找,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型):
GET /article_doc/_doc/1815982664109314052
- 请求
{"query": {"term": {"category": "技术"}}
}
- 响应
{"_index": "article_doc","_type": "_doc","_id": "1815982664109314052","_version": 1,"_seq_no": 4,"_primary_term": 1,"found": true,"_source": {"author": "华为","category": "技术","content": "就在昨天,华为正式官宣自研编程语言 「仓颉」 正式诞生!!!\r\n\r\n华为,作为全球领先的信息与通信技术(ICT)解决方案提供商,以“仓颉”编程语言的诞生,再次引领了技术革新的潮流,为智能时代的软件开发定义了新的艺术。","createTime": "2024-07-24 13:29:41","id": "1815982664109314052","readCount": 1,"title": "华为自研编程语言“仓颉”正式发布"}
}
terms查询:terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去 做匹配:
{"query": {"terms": {"category": [ "技术","管理"]}}
}
全文查询
顾名思义,全文查询会分析查询条件,先将查询条件进行分词,然后查询,求并集。
区别于term,match的区别是:match是经过analyer分词器分词的,也就是说,文档首先被分析器给处理了。根据不同的分析器,分析的结果也稍显不同,然后再根据分词结果进行匹配。term则不经过分词,它是直接去倒排索引中查找了精确的值了。
match 查询的主要用法:
- match_all:查询所有,无条件;太简单不再演示!
- match:返回所有匹配到的数据
- match_phrase:短语查询,在match的基础上进一步查询词组,可以指定slop分词间隔。
{"query": {"match_phrase": {"content": {"query": "中国"}}}
}
- match_phrase_prefix:前缀查询,根据短语中最后一个词组做前缀匹配,可以应用于搜索提示,但注意和max_expanions搭配。
- multi_match:多字段查询,使用相当的灵活,可以完成match_phrase和match_phrase_prefix的工作。
post /article_doc/_search
- 请求
{"query": {"match": {"content": "技术"}}
}
- 响应
{"took": 11,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 3.3864474,"hits": [{"_index": "article_doc","_type": "_doc","_id": "1815982664109314052","_score": 3.3864474,"_source": {"author": "华为","category": "技术","content": "就在昨天,华为正式官宣自研编程语言 「仓颉」 正式诞生!!!\r\n\r\n华为,作为全球领先的信息与通信技术(ICT)解决方案提供商,以“仓颉”编程语言的诞生,再次引领了技术革新的潮流,为智能时代的软件开发定义了新的艺术。","createTime": "2024-07-24 13:29:41","id": "1815982664109314052","readCount": 1,"title": "华为自研编程语言“仓颉”正式发布"}}]}
}
- 多字段查询
{"query": {"multi_match": {"query": "中国","fields": ["title","content"]}}
}
排序查询
例如,按照文章阅读数降序排序:
{"query": {"match_all": {}},"sort": [{"readCount": {"order": "desc"}}]
}
范围查询
range 过滤允许我们按照指定范围查找一批数据,范围操作符包含:
- gt:大于,相当于关系型数据库中的 >
- gte:大于等于,相当于关系型数据库中的 >=
- lt:小于,相当于关系型数据库中的 <
- lte:小于等于,相当于关系型数据库中的 <=
例如,查询文章阅读数大于5的文章列表:
{"query": {"range": {"readCount": {"gt": 5}}}
}
分页查询
{"query": {"match_all": {}},"from": 0,"size": 5
}
高亮查询
{"query": {"match": {"content": "智能"}},"highlight": {"fields": {"content": {"pre_tags": "<b class='key' style='color:red'>","post_tags": "</b>"}}}
}
{"took": 32,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 3,"relation": "eq"},"max_score": 1.2924489,"hits": [{"_index": "article_doc","_type": "_doc","_id": "1815982664109314052","_score": 1.2924489,"_source": {"author": "华为","category": "技术","content": "就在昨天,华为正式官宣自研编程语言 「仓颉」 正式诞生!!!\r\n\r\n华为,作为全球领先的信息与通信技术(ICT)解决方案提供商,以“仓颉”编程语言的诞生,再次引领了技术革新的潮流,为智能时代的软件开发定义了新的艺术。","createTime": "2024-07-24 13:29:41","id": "1815982664109314052","readCount": 1,"title": "华为自研编程语言“仓颉”正式发布"},"highlight": {"content": ["华为,作为全球领先的信息与通信技术(ICT)解决方案提供商,以“仓颉”编程语言的诞生,再次引领了技术革新的潮流,为<b class='key' style='color:red'>智能</b>时代的软件开发定义了新的艺术。"]}},{"_index": "article_doc","_type": "_doc","_id": "1815982664180617221","_score": 0.9935417,"_source": {"author": "狸花猫","category": "人工智能","content": "在信息时代,Web 页面成为我们与世界交互的重要窗口。如今,AI 程序的出现,为 Web 页面带来了新的变革。通过在 Web 页面上实现图片识别,我们即将迈入一个更加智能与便捷的时代。它将赋予网页全新的能力,使其能够理解图片的内容,为用户带来前所未有的体验。让我们一同踏上这充满无限可能的探索之旅。\n\n作者:睡着学\n链接:https://juejin.cn/post/7359084330121789452\n来源:稀土掘金\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。","createTime": "2024-07-24 13:29:41","id": "1815982664180617221","readCount": 3,"title": "AI 赋能007 jack Web 页面,图像识别超越想象"},"highlight": {"content": ["通过在 Web 页面上实现图片识别,我们即将迈入一个更加<b class='key' style='color:red'>智能</b>与便捷的时代。它将赋予网页全新的能力,使其能够理解图片的内容,为用户带来前所未有的体验。让我们一同踏上这充满无限可能的探索之旅。"]}},{"_index": "article_doc","_type": "_doc","_id": "1815982664180617220","_score": 0.85687244,"_source": {"author": "kimi","category": "人工智能","content": "今年,随着各大GLM模型的开源和算力的提升,尤其是最近比较火热的月之暗面的Kimi 模型,AI应用场景中的各种智能体如雨后春笋般涌现。许多同学们纷纷表达了加入AI应用的学习和测试的愿望,然而各大模型提供商所提供的API的免费tokens在数量和其他方面都存在着不同的限制,这给我们这些白嫖党带来了一定的不便。今天,在GitHub上,我发现了这个名为kimi-free-api的项目,它为我们学习和测试使用GLM模型提供了极大的便利。\n\n作者:修己xj\n链接:https://juejin.cn/post/7357546247848427558\n来源:稀土掘金\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。","createTime": "2024-07-22 13:29:41","id": "1815982664180617220","readCount": 10,"title": "免费使用Kimi的API接口,kimi-free-api真香"},"highlight": {"content": ["今年,随着各大GLM模型的开源和算力的提升,尤其是最近比较火热的月之暗面的Kimi 模型,AI应用场景中的各种<b class='key' style='color:red'>智能</b>体如雨后春笋般涌现。"]}}]}
}
布尔查询
bool 查询可以用来合并多个条件查询结果的布尔逻辑,它包含以下操作符:
- must:多个查询条件必须完全匹配,相当于关系型数据库中的 且 and
- should:至少有一个查询条件匹配,相当于关系型数据库中的 或 or
- must_not: 多个查询条件的相反匹配,相当于关系型数据库中的 非 not
- filter:过滤满足条件的数据。
range:条件筛选范围,上面讲过了
{"query": {"bool": {"should": [{"match": {"title": "智能"}},{"match": {"content": "智能"}}]}}
}
聚合查询
我们平时在使用Elasticsearch时,更多会用到聚合操作,它类似SQL中的group by操作。ES的聚合查询一定是先查出结果,然后对结果使用聚合函数做处理,常用的操作有:avg:求平均、max:最大值、min:最小值、sum:求和等。
在ES中聚合分为指标聚合和分桶聚合:
- 指标聚合:指标聚合对一个数据集求最大、最小、和、平均值等
{"query": {"match_all": {}},"aggs": {"avg_read": {"avg": {"field": "readCount"}}},"_source": ["id","readCount"]
}
- 响应
{"took": 5,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 10,"relation": "eq"},"max_score": 1,"hits": [{"_index": "article_doc","_type": "_doc","_id": "1815982662364483586","_score": 1,"_source": {"id": "1815982662364483586","readCount": 0}},{"_index": "article_doc","_type": "_doc","_id": "1815982664109314049","_score": 1,"_source": {"id": "1815982664109314049","readCount": 1}},{"_index": "article_doc","_type": "_doc","_id": "1815982664109314050","_score": 1,"_source": {"id": "1815982664109314050","readCount": 2}},{"_index": "article_doc","_type": "_doc","_id": "1815982664109314052","_score": 1,"_source": {"id": "1815982664109314052","readCount": 1}},{"_index": "article_doc","_type": "_doc","_id": "1815982664109314053","_score": 1,"_source": {"id": "1815982664109314053","readCount": 5}},{"_index": "article_doc","_type": "_doc","_id": "1815982664180617218","_score": 1,"_source": {"id": "1815982664180617218","readCount": 6}},{"_index": "article_doc","_type": "_doc","_id": "1815982664180617219","_score": 1,"_source": {"id": "1815982664180617219","readCount": 0}},{"_index": "article_doc","_type": "_doc","_id": "1815982664180617220","_score": 1,"_source": {"id": "1815982664180617220","readCount": 10}},{"_index": "article_doc","_type": "_doc","_id": "1815982664109314051","_score": 1,"_source": {"id": "1815982664109314051","readCount": 3}},{"_index": "article_doc","_type": "_doc","_id": "1815982664180617221","_score": 1,"_source": {"id": "1815982664180617221","readCount": 3}}]},"aggregations": {"avg_read": {"value": 3.1}}
}
- 分桶聚合:除了有聚合函数外,还可以对查询出的数据进行分组group by,再在组上进行游标聚合。
{"size": 0,"query": {"match_all": {}},"aggs": {"age_group": {"terms": {"field": "category"}}}
}
- 响应:
{"took": 208,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 10,"relation": "eq"},"max_score": null,"hits": []},"aggregations": {"age_group": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": "人工智能","doc_count": 3},{"key": "技术","doc_count": 2},{"key": "经济","doc_count": 2},{"key": "生活","doc_count": 1},{"key": "管理","doc_count": 1},{"key": "面试","doc_count": 1}]}}
}
总结
以上就是DSL的核心用法,用到了再看也不迟,单纯记忆很快就会忘记没啥用。
相关文章:
ElasticSearch核心之DSL查询语句实战
什么是DSL? Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。 DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。目前常用的框架查询方法什么的底层都是构建DSL语句实现的,所以你必…...
Axure中继器:数据动态展示的强大工具
在Axure RP这一强大的原型设计工具中,中继器(Repeater)无疑是一颗璀璨的明珠。它以其独特的功能和广泛的应用场景,成为设计师在创建数据密集型原型时的首选。本文将深入探讨Axure中继器的特点、使用方式及其在数据动态展示中的重要…...
QT--聊天室
一、设计要求 用QT做一个聊天室, 制作一个服务器和客户端。可以进行注册、登录, 登陆成功后可以使用昵称进行发送、接收消息。 能根据昵称、聊天内容查询历史记录,也可以查询全部聊天记录。 。 二、客户端三级ui界面 三、项目代码 //在…...
Javascript前端面试基础4【每日学习并更新10】
同步和异步的区别 同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等…...
社区团购系统搭建开发,前端uniapp。社区团购搭建开发定制
目录 前言: 一、社区团购系统有哪些功能? 二、社区团购管理端 三、社区团购的基本流程如下: 总结 : 前言: 社区团购是一种以社区为单位进行的集体购物模式。这种模式利用了互联网平台来组织同一社区内的居民一起购…...
node+mysql+layui+ejs实现左侧导航栏菜单动态显示
nodemysqllayuiejs实现左侧导航菜单动态显示 实现思路效果图数据库技术栈代码实现main.html(前端首页页面)查询资源菜单方法 jsapp.js配置ejs模板 node入门到入土项目实战开始,前端篇项目适合node小白入门,因为我也是小白来学习no…...
FRP配置内网穿透52版本以上适用
简述 适用frp配置内网穿透来说我们需要进行简单的区分,具有公网IP的服务器我们简称为服务端,内网的服务器我们可以简称为客户端,frp需要针对不同的服务器配置不同的文件 下载安装包 Linux下载地址 https://github.com/fatedier/frp/relea…...
IFM易福门LR3000LR3300液位传感器操作说明
IFM易福门LR3000LR3300液位传感器操作说明...
【Python大语言模型系列】基于阿里云人工智能平台采用P-Tuning v2微调ChatGLM2-6B大模型(完整教程)
这是我的第331篇原创文章。 一、引言 P-Tuning 是一种对预训练语言模型进行少量参数微调的技术。所谓预训练语言模型,就是指在大规模的语言数据集上训练好的、能够理解自然语言表达并从中学习语言知识的模型。P-Tuning 所做的就是根据具体的任务,对预训练…...
基于Spring boot + Vue的加油站系统
项目名称:加油站系统 作者的B站地址:程序员云翼的个人空间-程序员云翼个人主页-哔哩哔哩视频 csdn地址:程序员云翼-CSDN博客 1.项目技术栈: 前后端分离的项目 后端:Springboot MybatisPlus 前端:Vue…...
️RPC协议 --基于TCP实现RPC通信
RPC 协议介绍 RPC(Remote Procedure Call,远程过程调用)协议是一种通信协议,允许一个程序调用另一个地址空间(通常是在网络上)的过程或函数,而不需要显式地处理细节如数据序列化和网络通信。它允许开发人员编写分布式应用程序,就像编写本地应用程序一样。 关键特点和组…...
android(安卓)最简单明了解释版本控制之MinSdkVersion、CompileSdkVersion、TargetSdkVersion
1、先明白几个概念 (1)平台版本(Android SDK版本号) 平台版本也就是我们平时说的安卓8、安卓9、安卓10 (2)API级别(API Level) Android 平台提供的框架 API 被称作“API 级别” …...
Redis缓存穿透、击穿和雪崩的理解和解决思路
Redis的缓存穿透 缓存穿透是指那些查询请求所要获取的数据既不在缓存(Redis)中,也不在数据库(例如:MySQL)中,因此每次请求都会直接访问数据库。这种情况通常由以下几种情形引起: 恶…...
ReactHooks(完结)
上期戳here ReactHooks[三] 一.memo 函数1.1 语法格式 二. useMemo2.1 问题引入2.2 语法格式2.3 使用 useMemo 解决刚才的问题 三.useCallback3.1 useMemo和useCallback区别3.2 语法格式 四.useTransition4.1 问题引入4.2 语法格式4.3 使用 isPending 展示加载状态4.4 注意事项…...
【数据中台】大数据管理平台建设方案(原件资料)
建设大数据管理中台,按照统一的数据规范和标准体系,构建统一数据采集﹣治理﹣共享标准、统一技术开发体系、统一接口 API ,实现数据采集、平台治理,业务应用三层解耦,并按照统一标准格式提供高效的…...
UE5+OpenCV配置(Windows11系统)
一、概述 因为需要在UE5中使用OpenCV这些工具进行配置,所以在网络上参考借鉴一些资料进行配置。查询到不少的资料,最后将其配置成功。在这里顺便记录一下自己的配置成功的过程。 二、具体过程 (一)版本 使用Windows11系统、UE5.…...
自研Vue3开源Tree组件:节点拖拽bug修复
当dropType为after,且dropNode为父节点时,bug出现了: bug原因:插入扁平化列表的位置insertIndex计算的不对: 正确的逻辑,同inner要算上子孙节点所占的位置: bug修复!...
SSM学习9:SpringBoot简介、创建项目、配置文件、多环节配置
简介 SpringBoot式用来简化Spring应用的初始搭建以及开发过程的一个框架 项目搭建 File -> New -> Project 选中pom.xml文件,设置为maven项目 项目启动成功 可以访问BasicController中的路径 配置文件 在resources目录下 application.properties 默…...
Java面试题---索引
什么是索引 索引是用来高效获取数据的存储结构如同字典的目录一样,数据库的索引通常使用btree来实现,索引树的节点和数据地址相关联,查询的时候在索引树种进行高效搜索,然后根据数据地址获取数据。索引提高了搜索的效率同时增加了…...
ollama本地部署大语言模型记录
目录 安装Ollama更改模型存放位置 拉取模型GemmaMistralQwen1.5(通义千问)codellama 部署Open webui测试性能知识广度问题1问题2 代码能力总结 最近突然对大语言模型感兴趣 同时在平时的一些线下断网的CTF比赛中,大语言模型也可以作为一个能对话交互的高级知识检索…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
