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的核心用法,用到了再看也不迟,单纯记忆很快就会忘记没啥用。

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

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

相关文章

Dockerfile指令详解和Docker操作命令

1.容器的特点&#xff1a;1&#xff09;自包含&#xff08;包括应用程序及其运行环境&#xff09;&#xff1b;2&#xff09;可移植&#xff1b;3&#xff09;相互隔离&#xff1b;4&#xff09;轻量级。 2.docker成为容器的事实标准在于&#xff1a;1&#xff09;在运行环境上…

【区块链】如何发行自己的加密货币到以太坊测试网络,remixIDE发行自己的数字货币

如何发行自己的加密货币到以太坊测试网络 环境 reminx在线编辑器&#xff1a;https://remix.ethereum.org/安装有小狐狸钱包插件&#xff08;MetaMask&#xff09; 如何部署代币&#xff1f; 创建一个名字叫做HelloMyToken.sol的文件。编写好智能合约&#xff0c;这边我要发…

文件包含漏洞--pyload

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.PHP伪协议利用 php://协议 php://filter &#xff1a;用于在读取作用和写入文件时进行过滤和转换操作。 作用1&#xff1a;利用base64编码过滤器读取源码 通常利用文件包含执行php://filte…

Opencv学习项目4——手部跟踪

上一篇博客我们介绍了mediapipe库和对手部进行了检测&#xff0c;这次我们进行手部关键点的连线 代码实现 import cv2 import mediapipe as mpcap cv2.VideoCapture(1) mpHands mp.solutions.hands hands mpHands.Hands() mpDraw mp.solutions.drawing_utilswhile True:…

Flutter - 安卓一次打包不同包名的apk

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 有时为了方便测试&#xff0c;同一个app需要在一个手机上装两个&#xff0c;直接改包名的话比较麻烦&#xff0c;这时可以通过添加flavor进行多维度打包&#xff0c…

Spring Security面试三道题

针对Spring Security的面试题&#xff0c;从简单到困难&#xff0c;我可以给出以下三道题目&#xff1a; 1. Spring Security的基本功能是什么&#xff1f; 答案&#xff1a; Spring Security是Spring Framework的一部分&#xff0c;它提供了一种将安全层应用于Java应用程序的…

Flink入门(更新中)

目录 一、Flink 1.1 基本概念 1.1.1 flink简介 1.2 flink编程模版 1.3 常用概念 1.2.1 datastream 1.2.2 算子、Task 1.2.3 多流操作 1.2.6 时间语义 二、Flink编程实战(Java) 2.1 wordcount 一、Flink 1.1 基本概念 1.1.1 flink简介 1.图片介绍 性能&#xff1a…

OpenAI推出SearchGPT:革新搜索体验的新工具

引言 原文链接 在信息爆炸的时代&#xff0c;搜索引擎已经成为人们日常生活中不可或缺的工具。然而&#xff0c;传统的搜索引擎在理解复杂查询和提供准确答案方面仍有许多不足。为了解决这一问题&#xff0c;OpenAI与20240725推出了SearchGPT原型&#xff0c;将生成式AI与传统…

kafka源码阅读-ReplicaStateMachine(副本状态机)解析

概述 Kafka源码包含多个模块&#xff0c;每个模块负责不同的功能。以下是一些核心模块及其功能的概述&#xff1a; 服务端源码 &#xff1a;实现Kafka Broker的核心功能&#xff0c;包括日志存储、控制器、协调器、元数据管理及状态机管理、延迟机制、消费者组管理、高并发网络…

Vue常用指令及其生命周期

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 目录 1.常用指令 1.1 v-bind 1.2 v-model 注意事项 1.3 v-on 注意事项 1.4 v-if / v-else-if / v-else 1.5 v-show 1.6 v-for 无索引 有索引 生命周期 定义 流程 1.常用指令 Vue当中的指令…

数据库水印算法三道题

针对数据库水印算法的面试题&#xff0c;由简单到困难&#xff0c;可以设计以下三道题目&#xff1a; 1. 基础理解题 题目&#xff1a;请简要解释什么是数据库水印算法&#xff0c;并说明其主要应用场景。 参考答案&#xff1a; 数据库水印算法是一种在数据库中嵌入隐蔽信息…

Red Hat 9.4 配置Yum镜像源

1. 虚拟机信息 镜像&#xff1a;rhel-server-9.4-x86_64-dvd.iso 系统版本&#xff1a;Red Hat 9.4 版本信息&#xff1a; cat /etc/redhat-release Red Hat Enterprise Linux release 9.4 (Plow)2. 配置文件 vim /etc/yum.repos.d/local.repo # 按i键&#xff0c;输入以下内…

Linux 普通用户启动Nginx使用80端口,小于1024的端口

让 Nginx 运行在 root 权限下&#xff1a; 在root用户下执行 cd /usr/local/nginx/sbin/ chown root nginx chmod us nginx或者&#xff1a;cd /usr/local/nginx/sbin/ sudo chown root nginx sudo chmod us nginx

远程项目调试-informer2020

informer2020 Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting(原文&#xff09;Informer 是一个基于Transformer的模型&#xff0c;是为了应对长依赖关系而开发的。本文的主要主题是序列预测。序列预测可以在任何具有不断变化的数据的地方…

[笔记]ONVIF服务端实现[进行中...]

1.文档搜索&#xff1a; 从&#xff1a;https://www.cnblogs.com/liwen01/p/17337916.html 跳转到了&#xff1a;ONVIF协议网络摄像机&#xff08;IPC&#xff09;客户端程序开发&#xff08;1&#xff09;&#xff1a;专栏开篇_onvif 许振坪-CSDN博客 1.1原生代码支持&…

Linux——管理本地用户和组(详细介绍了Linux中用户和组的概念及用法)

目录 一、用户和组概念 &#xff08;一&#xff09;、用户的概念 &#xff08;二&#xff09;、组的概念 补充组 主要组 二、获取超级用户访问权限 &#xff08;一&#xff09;、su 命令和su -命令 &#xff08; 二&#xff09;、sudo命令 三、管理本地用户账户 &…

ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH?

ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH? 目录 ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH? 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/61780…

Transformer自然语言处理实战pdf阅读

一.第一章 欢迎来到transformer的世界 1.解码器-编码器框架 在Transformer出现之前&#xff0c;NLP的最新技术是LSTM等循环架构。这些架 构通过在神经网络连接使用反馈循环&#xff0c;允许信息从一步传播到另一 步&#xff0c;使其成为对文本等序列数据进行建模的理想选择。如…

图片检查 python脚本

图片检查 python脚本 import os from PIL import Imagedef is_image_broken(image_path):try:img Image.open(image_path)img.verify() # Verify that it is, in fact an imagereturn Falseexcept (IOError, SyntaxError) as e:return Truedef check_images_in_directory(di…

Unity分享:继承自MonoBehaviour的脚步不要对引用类型的字段在声明时就初始化

如果某些字段在每个构造函数中都要进行初始化&#xff0c;很多人都喜欢在字段声明时就进行初始化&#xff0c;对于一个非继承自MonoBehaviour的脚步&#xff0c;这样做是没有问题的&#xff0c;然而继承自MonoBehaviour后就会造成内存的浪费&#xff0c;为什么呢&#xff1f;因…