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.mfbz.cn/a/597740.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:理解人工智能相似性搜索

理解相似性搜索(也称为语义搜索)的指南,这是人工智能最新阶段的关键发现之一。 最新阶段人工智能的关键发现之一是根据相似性搜索和查找文档的能力。相似性搜索是一种比较信息的方法,其基于含义而非关键字。 相似性搜索也被称为语…

springboot+vue+elementui实现校园互助平台大作业、毕业设计

目录 一、项目介绍 二、项目截图 管理后台 1.登录(默认管理员账号密码均为:admin) 2. 用户管理 ​编辑 3.任务管理 互助单(学生发布) 行政单(教师发布) ​编辑 审核(退回需…

如何完美解决Outlook大文件传送问题,提升办公协作效率?

在日常工作中,邮件是一种常用的通信方式,经常用来发送各类文件,比如报告和文档、合同和协议、财务报表、营销资料、设计文件等。但有时文件会比较大,因此Outlook大文件传送时,会遇到附件大小受限的情况。常用的解决发送…

五分钟了解等级保护、风险评估和安全测评三者的区别和联系?

等级保护 基本概念:网络安全等级保护是指对国家秘密信息、法人和其他组织和公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的安全产品实行按等级管理,对信息系统中发生的信息安全事件…

已解决SyntaxError: EOL while scanning string literal 亲测有效!!!

已解决SyntaxError: EOL while scanning string literal 亲测有效!!! 亲测有效 报错问题解决思路解决方法 报错问题 SyntaxError: EOL while scanning string literal 这个错误通常发生在Python代码中,表示字符串字面量没有被正确…

打开深度学习的锁:(0)什么是神经网络?有哪些必备的知识点准备?

PS:每每温故必而知新 什么是神经网络? 一、一个单神经元的神经网络二、多个单神经元的神经网络三、到底什么是机器学习?(重点)1:什么是机器学习的训练?2:什么是模型?权重…

让网络分析更简单高效 - AnaTraf网络流量分析仪

随着互联网的迅速发展,网络流量分析已经成为IT运维人员不可或缺的重要工具。作为网络性能监测与诊断(NPMD)领域的佼佼者,AnaTraf网络流量分析仪凭借其出色的性能和易用性,正在快速占领市场。本文将为您深入解读AnaTraf,让您了解它是如何帮助企业高效管理网络的。 全流量回溯分…

苏州金龙荣获首届无人扫地机器人演示比赛“竞技领跑奖”

4月30日,2024年苏州市首届无人扫地机器人演示比赛在高新区思益街展开比拼。五家企业参赛在道路上实地比拼无人扫地机器人技术,通过清扫垃圾、识别路障等环节展现城市清洁的“未来场景”。经过角逐,苏州金龙的无人驾驶清扫车获得步道演示比赛“…

老旧房屋用电线路故障引起的电气火灾预防对策​

摘 要:在我国新农村建设方针指引下,农村地区的发展水平有了显著提高。在农村经济发展中,我们也要认识到其中存在的风险隐患问题,其中重要的就是火灾事故。火灾事故给农村发展带来的不利影响,不仅严重威胁到农村群众的生…

软件测试与管理-白盒测试-基本路径测试法

知识点: 1.原理 是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径的集合,然后根据可执行路径进行测试用例设计的方法。此方法设计出的测试用例需保证被测程序的每个可执行语句至少执行一次。 2.步骤 &a…

连通“数据”,让制造变“聪明”

说起数据智能,你第一时间想到的是什么呢?是科技感十足的智慧城市?还是炫酷的人工智能景象? 数据作为企业的战略资产越来越受到重视,从最初的数据协助业务协同,转化为数据驱动业务,数据驱动运营…

组播应用:SW1、SW2、RT1、RT2、AC1运行PIM-SM

SW1、SW2、RT1、RT2、AC1运行PIM-SM,SW1 Vlan10为C-BSR和C-RP;SW1产品网络(PC1)启用组播,用VLC工具串流播放视频文件“1.mp4”,模拟组播源,设置此视频循环播放,组地址232.1.1.1,端口1234,实现总公司和分公司收看视频,用PC2测试。 一、SW1、SW2、RT1、RT2、AC1配置如…

CV每日论文--2024.5.7

1、Vibe-Eval: A hard evaluation suite for measuring progress of multimodal language models 中文标题:Vibe-Eval: 一个测量多模态语言模型进度的严格评估套件 简介:本文介绍了一种新的开放评估基准 Vibe-Eval,用于评估多模态对话模型的性能。 Vibe…

C++学习笔记——对仿函数的理解

文章目录 思维导图仿函数出现的逻辑仿函数使用上的巧妙 仿函数的本质仿函数的优势仿函数语法的巧妙 思维导图 仿函数出现的逻辑 我们在学习stack时会遇到一些新的问题,这些问题需要我们使用非类型模板参数去解决,即我们需要在设计类时需要有一个途径去快…

Mujoco210和Mujoco-py在 Ubuntu22.04 下的安装

mujoco和mujoco-py的关系:mujoco是一个物理引擎,主要应用于强化学习和最优化控制领域。mujoco-py是mujoco编程的 Python 接口,由OpenAI Gym开发,可以使用mujoco_py方便地调用mujoco的API。 mujoco官网: https://mujoco…

Elementui的el-footer标签使用报错

Elementui的el-footer标签使用报错 其余标签的使用没有报错信息 el-footer的报错信息 原因: ​ 警告信息表示 Vue 不识别 <el-footer> 解决方式: 在组件中进行引入和暴露

编程入门(六)【Linux系统基础操作二】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;文件与目录的操作命令cd change directory的缩…

代码随想录算法训练营Day12 | 二叉树理论基础、递归遍历、迭代遍历、统一迭代

今日收获&#xff1a; 二叉树的递归遍历二叉树的迭代遍历&#xff0c;中序的迭代法和前、后序不一样二叉树的统一迭代法主要是用了标记法来实现&#xff08;要处理的节点放入栈之后&#xff0c;紧接着放入一个空指针作为标记&#xff09; 二叉树理论基础篇 题目分类 题目分…

ICode国际青少年编程竞赛- Python-1级训练场-多变量应用

ICode国际青少年编程竞赛- Python-1级训练场-多变量应用 1、 a 1 b 2 for i in range(4):Spaceship.step(a)Dev.step(b)Dev.step(-b)a a 1b b 12、 a 2 b 5 for i in range(3):Spaceship.turnLeft()Spaceship.step(a)Spaceship.turnRight()Spaceship.step(b)a a …

在线民宿预约系统:景区住宿预订新体验

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…
最新文章