ES:基础查询语法(简单易懂)

一、基础查询语句的结构:

GET http://ip:prot/textbook/_search

GET       

{          "query" : { ...query子句... },

           "aggs" : { ..aggs子句.. },

           "sort" : { ..sort子句.. }

           "from" : 0, // 返回搜索结果的开始位置

           "size" : 10, // 分页大小,一次返回多少数据

           "_source" :[ ...需要返回的字段数组... ],

   }

  • query子句:类似于mysql中的where语句,用于定义搜索条件,如等值查询、模糊查询、范围查询等(重点)
  • aggs字句:用于对搜索结果进行各种统计和分组。类似于mysql中的group by。例如可以计算某一字段不同值各自出现的次数,或者根据某个字段的值进行分组。
  • sort子句:这个就非常显而易见了,是对查询出来的结果进行根据某一规则进行排序。
  • from和size:这两个是配合使用的,是用来分页的。from定义的是展示的第一条数据的处于结果集的位置(也就是下标),size表示此次展示多大的结果集。这个两个也就相当于mysql中的limit和offset语句
  • "_source":通过这个列表控制返回数据中应该包含哪些字段,就相当于mysql中SELECT name ,age FROM People这个语句中的name,age。表示返回结果只包含这两个我们所需字段即可。

二、query子句详解:

讲这个query语句要是对分词器的概念还不理解可以看一下下面这个文章,了解一下其es的一些基本概念:初识ES(ES的基本概念、倒排索引、索引和文档的CRUD)

        在es中我们要知道,我们所查询的内容,是被分词器进行了分词并将其保存下来,我们查询是通过匹配这个词进行查询的。

所将要查询的文档:

假设其中bookName的值被分词为:“My”、“name”、“is”、“CSDN”

{"_index": "my_index","_id": "12Sad33fdAdfFWW","_source": {"bookName": "My name is CSDN","author": "起床","number": 120}
}

1 、match查询:

match是一种会将你搜索的query进行分词的查询方法。而不是直接拿你的查询语句原封不动的去与被分词过后词进行匹配。

根据bookName字段进行查询:

GET http://ip:prot/my_index/_search
{"query": {"match": {"bookName":"This is CSDN"}}
}

这个查询会先讲查询语句中的“This is CSDN”进行分词,得到“This”、“is”、“CSDN”会分别拿这三个词去匹配,就会发现“is”和“CSDN”都能匹配成功只要一个匹配成功则就可以。所以可以查询到。

2、match_phrase查询:

这个查询和普通的match查询相比限制性更强,他依旧会对query内的值进行分词,但他并不是匹配到一处分词就匹配成功,而是对所有的词都能匹配才算成功。而且每个词都相对位置还得正确,默认情况下词与词之间在被搜索原文中是连续的。像前面咱举的那个例子就匹配不成功,This没有匹配到,要是讲“This”换为name就可以,但如果换为My也不成功,虽然My匹配成功但和“is”并不连续。

咱看match_phrase是不是太严格了,所以我们有一个参数“slop”,这个参数可以用于控制词与词之间不一定要连续,可以隔几个词。具体几个看slop的值。

GET http://ip:prot/my_index/_search
{"query": {"match_phrase": {"bookName":{"query":"My is CSDN","slop":1}}}
}

这个就可以匹配成功,虽然“My”和“is”之间还隔了一个“name”,但slop参数为1,说明词与词之间可以间隔一个词,不一定连续。

可以看到此时bookName的格式又深了一层,因为我们需要添加slop参数。

3、multi_match查询:

这个查询也会进行分词,就是对多个字段进行match操作,只要一个字段匹配上了就行。其中bookName匹配不上,但author字段能匹配上。则能查询到。也就是对bookName和author字段分别进行了一次的match操作。

GET http://ip:prot/textbook/_search
{"query": {"multi_match": {"query" : "起床","fields" : ["bookName", "author"]}}
}

4、Term查询:

与match查询相对应的是Term查询,他不会对query内的值进行分词,直接拿整个短语进行匹配。非常适用于精确匹配的需求,例如查找特定ID、邮箱地址、状态代码等。它不执行任何文本分析或模糊匹配,只关注精确匹配。

GET http://ip:prot/textbook/_search
{"query": {"term": {"bookName": "My name is CSDN"}}
}

这个”bookName“虽然和es中所存储的一模一样,但是查询不到,因为此时再es中用于查询的是一个个的短语,而term是直接拿整个短语去匹配的,那当然是查询不到的。

5、Terms查询:

Terms查询就是获取多个term查询结果的并集。

下面这个就是当bookName中的“My”还有“CSDN”匹配成功但”apple“匹配不成功,但因为是并集,所以只要有一个符合即可。所以能够查询到。

GET http://ip:prot/my_index/_search
{"query": {"terms": {"bookName": ["My", "CSDN", "apple"]}}
}

6、Prefix查询(前缀查询):

        在特定字段上查找以指定前缀开头的文档。它不会对查询字符串进行分词,而是直接在字段上进行精确匹配。

        适用于需要对特定前缀进行精确匹配的场景。例如,在搜索用户输入时,可以快速过滤出以特定字母开头的单词或短语;在数据库中查找以特定前缀开头的文档;在日志文件中查找以特定标识符开头的行等。

GET http://ip:prot/my_index/_search
{"query": {"prefix": {"bookName": {"value" : "Thi"}}}
}

这个能匹配到This,所以能查询到 。

7、fuzzy和wildcard查询(模糊查询):

        这两个查询方式都不会对查询条件的值进行分词。两者进行的都是模糊查询。

fuzzy查询例子:其中我误将name打成nane,但由于我参数fuzziness值为1,说明我可以改动一个字符(添加、删除、修改都可)。将nane可以变成name。所以匹配成功。fuzziness默认值为2.

GET http://ip:prot/textbook/_search
{"query": {"fuzzy": {"bookName":{"value":"nane","fuzziness":1}}}
}

 wildcard查询例子:这个查询语句我们就可以查询到name,其中将?替换成任何字符,只要能匹配上的都可。如果为*号则是只要以na为首以e为结尾的都可。

GET http://ip:prot/textbook/_search
{"query": {"wildcard": {"bookName":{"value":"na?e"}}}
}
  • 使用场景差异:Fuzzy查询适用于需要精确匹配但可能存在拼写错误的场景。它通过计算编辑距离来确定查询词与文档之间的相似度,从而找到可能的匹配。而Wildcard查询则适用于需要更灵活的模糊匹配的场景,如根据部分字符串或模式进行匹配。
  • 匹配方式差异:Fuzzy查询基于编辑距离(Levenshtein距离)计算查询词与文档之间的相似度。它通过计算一个词项与文档之间的最小编辑操作次数来找到与查询词相似的文档。而Wildcard查询则使用通配符模式进行匹配,通过指定星号(*)和问号(?),可以匹配任意字符或单个字符。
  • 性能差异:Fuzzy查询在处理大规模数据时可能会变得低效,因为它需要对每个文档进行逐一比较。而Wildcard查询则更加适用于大规模数据的模糊匹配,因为它使用通配符模式进行匹配,可以减少需要检查的文档数量。

8、range查询(范围查询):

range查询就是对某一字段的数值进行范围查询。

  • gte:大于等于
  • gt:大于
  • lte:小于等于
  • lt:小于

下面这个查询条件刚好能查询到,因为120处于 (100,120]范围之内。

GET http://ip:prot/my_index/_search
{ "query": {"range": { "number": { "gt":100, "lte":120 } }} 
}

9、bool查询

这个查询顾名思义就是将多个查询条件结合起来,根据逻辑词来判断是否成立:

  • must:相当于且
  • should:相当于或
  • must_not:相当于非

注意这里面有must和should两个查询集合,这两个查询集合要取并集,才能被查询到。也就是说must里面条件要全满足且should里面条件至少满足一项才可以。按照下面这个条件来查询是类查询到的。

GET http://ip:prot/my_index/_search
{"query":{"bool":{"must":{"match":{"bookName":"My name is apple"}},"should":{"term":{"author":"apple"},"range":{"num":{"lte":120}},}}}
}

三、sort子句和分页详解

        这是排序条件部分,用于指定检索结果的排序方式。你可以根据一个或多个字段进行排序,并指定排序的方向(升序或降序)。

途中根据query查询出来的文档根据number降序排序。且进行分页,取1-10条数据。

GET http://ip:prot/my_index/_search
{ "query": {"range": { "number": { "gt":100, "lte":120 } }}, "sort": {"number": {"order": "desc"}},"from":0,"size":10,}

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

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

相关文章

解锁自动化办公新技能:Python实战应用-自动转发邮件到企业微信

📧 【高效联络,信息不落空】 📧 在这个信息爆炸的时代,作为企业的一员,我们如何从繁杂的邮件中迅速筛选出客户的心声、展会的新动向,同时又不遗漏每一份重要的咨询呢?秘诀就在我们的新策略里&a…

Springboot监听ConfigMap配置文件自动更新配置

背景: 最近调研使用k8s的ConfigMap来作为springboot项目的配置中心,需要实现热更新机制,避免pod重启影响业务。 ConfigMap作为挂载卷使用的时候可以更新pod中的配置内容,但是业务应用需要能监听并处理这些变更。我在测试的时候已…

Day3 | Java基础 | 4常见类

Day3 | Java基础 | 4 常见类 基础版Object类equalshashCode(散列码)hashCode和equals clone方法String类 问题回答版Object类Object类的常见方法有哪些?和equals()的区别是什么?为什么要有hashCode?hashCode和equals的…

FFmpeg常用命令详解与实战指南

下载地址:Releases BtbN/FFmpeg-Builds (github.com) 1. 获取视频信息 使用FFmpeg获取视频信息是最基本的操作之一。你可以使用-i选项指定输入文件,然后使用FFmpeg内置的分析器来获取视频的各种信息,包括视频编解码器、音频编解码器、分辨…

JAVA文件的简单操作

文件IO(Input和Output) 文件的输入和输出是人为规定的,那么什么是输入?什么是输出捏?在这里统一已CPU为基准 例如:将文件由内存写入硬盘就是输出,有硬盘写入内存就是输入。可以总结为&#xff…

OpenHarmony 3.2 Release版本实战开发——Codec HDI适配过程

简介 OpenHarmony Codec HDI(Hardware Device Interface)驱动框架基于 OpenMax 实现了视屏硬件编解码驱动,提供 Codec 基础能力接口供上层媒体服务调用,包括获取组件编解码能力、创建组件、参数设置、数据的轮转和控制、以及销毁…

C++反汇编,指针和内存分配细节,面试题05

文章目录 20. 指针 vs 引用21. new vs malloc 20. 指针 vs 引用 指针是实体,占用内存空间,逻辑上独立;引用是别名,与变量共享内存空间,逻辑上不独立。指针定义时可以不初始化;引用定义时必须初始化。指针的…

Cmake编译源代码生成库文件以及使用

在项目实战中,通过模块化设计能够使整个工程更加简洁明了。简单的示例如下: 1、项目结构 project_folder/├── CMakeLists.txt├── src/│ ├── my_library.cpp│ └── my_library.h└── app/└── main.cpp2、CMakeList文件 # CMake …

刷题记录2

文章目录 刷题记录21047.删除字符串中的所有相邻重复项150.逆波兰表达式求值239.滑动窗口最大值347.前k个高频元素144.二叉树前序遍历(145、94后序、中序)102.二叉树的层序遍历226.翻转二叉树101.对称二叉树104.二叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数 …

Python sqlite3库 实现 数据库基础及应用 输入地点,可输出该地点的爱国主义教育基地名称和批次的查询结果。

目录 【第11次课】实验十数据库基础及应用1-查询 要求: 提示: 运行结果: 【第11次课】实验十数据库基础及应用1-查询 声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 1.简答题 数据库文件Edu_Base.db&#…

国内唯一!阿里云荣膺MongoDB“2024年度DBaaS认证合作伙伴奖”

近日,在MongoDB用户大会纽约站上,阿里云荣膺MongoDB“2024年度DBaaS认证合作伙伴奖”。这是阿里云连续第五年斩获MongoDB合作伙伴奖项,也是唯一获此殊荣的中国云厂商。 MongoDB是当今全球最受欢迎的非关系型数据库之一。凭借灵活的模式和丰富…

day10-16:Spring Security

Spring Security安全控制 1、介绍Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。 2、功能Authentication 认证,就是用户登录Authorization 授权,判断用户拥有什么权限,可以访问什么资源…

Unity 修复Sentinel key not found (h0007)错误

这个问题是第二次遇到了,上次稀里糊涂的解决了,也没当回事,这次又跑出来了,网上找的教程大部分都是出自一个人。 1.删除这个路径下的文件 C:\ProgramData\SafeNet Sentinel,注意ProgramData好像是隐藏文件 2.在Windows…

Redis(安装及配置)

1.什么是redis Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库,由意大利人 Salvatore Sanfilippo 使用 C 语言编写。 2.优势 性能极高&#xff…

如何进行资产梳理

前言 为什么要进行资产梳理? 资产梳理方式一: 一、安全防护设备资产 二、对外开放服务项目资产 三、项目外包业务流程资产 资产梳理方式二: 一、业务资源梳理 二、设备资产梳理 三、第三方的服务信息梳理 风险梳理 风险有哪些? 一,账号权限风…

【VTKExamples::Rendering】第一期 TestAmbientSpheres(环境照明系数)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例TestAmbientShperes,介绍环境照明系数对Actor颜色的影响,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动…

《ESP8266通信指南》14-连接WIFI(基于Lua)

往期 《ESP8266通信指南》13-Lua 简单入门(打印数据)-CSDN博客 《ESP8266通信指南》12-Lua 固件烧录-CSDN博客 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP8266通信指南》10-MQTT通信(Arduino开发)-CSDN博客 《ES…

Python中对象数据的持久化操作

含义: 对象数据的持久化操作指的是将Python程序中的对象保存到某种形式的持久化存储介质(如文件、数据库)中,以便在程序重新运行或在其他程序中使用时能够重新加载这些对象。持久化操作可以确保数据在程序关闭后不会丢失&#xff…

谷歌明年6月关闭 Google Fit 运动记录API,要求开发者迁移至Android Health平台 | 最新快讯

5 月 6 日消息,谷歌近日发布官方新闻稿,宣布将在明年 6 月使用 Android Health 平台取代 Google Fit 运动记录 API,开发人员应当尽早启动迁移计划。 谷歌自 2022 年起逐渐扩大对 Android Health 平台的投资,旨在减少平台碎片化&am…

Java17 --- SpringCloud之Zipkin链路追踪

目录 一、下载zipkin及运行 二、在父工程中引入pom依赖 三、在子工程8001引入相关pom依赖 3.1、修改yml配置文件 3.2、测试代码 四、在子工程80引入相关pom依赖 4.1、修改yml配置文件 4.2、测试代码 五、测试结果 一、下载zipkin及运行 运行控制台访问地址&#xff1…