ElasticSearch学习笔记七:ES查询(二)

news2024/11/29 11:33:24

一、前言

在前面的文章我们学习了ES的一些基本查询,同时用Java全部实现了一遍,今天我们继续深入学习一下ES的查询。

二、Term级别查询

在 Elasticsearch 中,Term 级别查询用于精确匹配字段值。与全文搜索不同,Term 级别查询不会进行分词处理,而是直接匹配字段的完整值。这使得 Term 级别查询非常适合用于精确匹配、过滤和聚合操作。

1、Term查询

Term是ES中用于精确匹配的关键字,可以理解为Mysql中的等于,例如我现在想搜索城市是“北京”的酒店就可以这么写:

GET /hotel/_search
{
  "query": {
    "term": {
      "city": {
        "value": "北京"
      }
    }
  }
}
这段DSL翻译成Mysql就是 select * from hotel where `city` = '北京'

需要注意的是,尽量避免使用Term去查询Text类型的数据,因为Text会被分词,这会导致精准匹配变得困难,如果想搜索Text类型的数据可以使用Match(后面也会讲)

2、Terms查询

和Term类型,Terms也适用于精准匹配,但从名字上我们可以看出Terms是复数形式,意味着他可以支持多个条件(当然Term结合bool查询也能实现),例如我们现在想查询城市是青岛或者北京的酒店就可以这么写

GET /hotel/_search
{
  "query": {
    "terms": {
      "city": [
        "青岛",
        "北京"
      ]
    }
  }
}
这段DSL翻译成Mysql就是 select * from hotel where `city` in ('北京','青岛')

terms默认最多支持65,536个值,如果要修改的话可以修改该参数 index.max_terms_count

3、Terms Set

terms_set 是 Elasticsearch 中的一种查询类型,用于执行基于集合的条件查询。与普通的 terms 查询不同,terms_set 查询允许你定义更复杂的条件,例如集合中元素的数量必须满足某些条件。

PUT /programmer
{
  "mappings": {
    "properties": {
      "name":{
        "type": "keyword"
      },
      "skill":{
        "type": "keyword"
      },
      "required_matches":{
        "type":"Integer"
      }
    }
  }
}

我们的程序员索引有两个字段,姓名和技能,同时我们写入数据
POST /programmer/_bulk
{"index":{"_index":"programmer","_id":"1"}}
{"name":"张三","skill":["Java","C++","Python","JavaScript"],"required_matches":2}
{"index":{"_index":"programmer","_id":"2"}}
{"name":"李四","skill":"Python","required_matches":1}
{"index":{"_index":"programmer","_id":"3"}}
{"name":"王五","skill":["C++","Python"],"required_matches":2}

现在我们查询会C++、Python的程序员且至少会其中的几种的,在上述的文档里,张三我们设置的需要匹配(required_matches字段)等于2,李四=1,王五=2,此时我们的DSL如下

GET /programmer/_search
{
  "query": {
    "terms_set": {
      "skill": {
        "terms": [ "C++", "Python"],
        "minimum_should_match_field":"required_matches"
      }
    }
  }
}

结果如下
#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.17/security-minimal-setup.html to enable security.
{
  "took" : 878,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 0.7876643,
    "hits" : [
      {
        "_index" : "programmer",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.7876643,
        "_source" : {
          "name" : "张三",
          "skill" : [
            "Java",
            "C++",
            "Python",
            "JavaScript"
          ],
          "required_matches" : 2
        }
      },
      {
        "_index" : "programmer",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.7876643,
        "_source" : {
          "name" : "王五",
          "skill" : [
            "C++",
            "Python"
          ],
          "required_matches" : 2
        }
      },
      {
        "_index" : "programmer",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.17426977,
        "_source" : {
          "name" : "李四",
          "skill" : "Python",
          "required_matches" : 1
        }
      }
    ]
  }
}


可以看到所有的文档都返回了,我们来分析一下为什么结果是这样的。

(1)首先我们的查询条件是跟据skill字段terms精准匹配

(2)minimum_should_match_field使用的是 required_matches字段

(3)terms的值为C++和Python,张三会 “Java”,“C++”,“Python”,“JavaScript”,同时只需要满足两个就算匹配上,很显然是符合条件的,所以张三返回

(4)李四,虽然李四只会Python但是他设置的是只要满足一个条件就算匹配上,所以李四也匹配上了。

(5)最后王五,也是同样的道理。所以这次返回了张三、李四、王五。

4、exists

exists不是用来查询文档的,而是用来查询索引的,比如我们想看那些索引包含指定的字段,例如我想查看包含“skill”字段的索引就可以用exists

GET /_search
{
  "query": {
    "exists": {
      "field": "skill"
    }
  }
}

5、Range

Rang,用于范围匹配,例如我们想查询价格300~500的酒店,DSL可以这么写

GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 300,
        "lte": 500
      }
    }
  }
}
这个DSL翻译成SQL 就是 select * from hotel where price >= 300 and price <=500

range可用的参数有

gt(greater than ):大于

gte(greater than or equal):大于等于

lt(less than):小于

lte(less than or equal):小于等于

format:格式化,用于日期类型比较

6、prefix

前缀匹配,有点类似于Mysql中的前缀模糊匹配,需要注意的是prefix 查询默认是不适用于 text 类型字段的。这是因为 text 字段在索引时会被分析器(analyzer)拆分成多个词项(tokens),而 prefix 查询则需要匹配完整的前缀。比如我们想搜索张开头程序员,DSL就可以这么写

GET /programmer/_search
{
  "query": {
    "prefix": {
      "name": {
        "value": "张"
      }
    }
  }
}
7、IDs

IDs查询,就是根据文档的ID查询,这个没有太多东西可以说

GET /hotel/_search
{
  "query": {
    "ids" : {
      "values" : ["001","002"]
    }
  }
}

8、Fuzzy

Fuzzy查询,模糊查询或者说近似匹配,例如电商的里的搜索场景

-  用户输入的查询词可能存在拼写错误,Fuzzy 查询可以帮助返回与拼写错误相似的结果。 
-  例如,用户搜索 "aple" 时,Fuzzy 查询可以返回 "apple" 相关的结果。 

    这里先举个例子,后面再详细学习
GET /_search
{
  "query": {
    "fuzzy": {
      "user.id": {
        "value": "ki",
        "fuzziness": "AUTO",
        "max_expansions": 50,
        "prefix_length": 0,
        "transpositions": true,
        "rewrite": "constant_score"
      }
    }
  }
}

三、结束语

今天学习了一下ES中的 Term级别查询,ES中还有其他类型的搜索后面将继续,同时下一篇文章将用Java把上述的DSL全部实现一遍,希望对有所帮助。

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

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

相关文章

铲除数据安全三大“顽疾”,安全GPT如何“开药方”?

近年来&#xff0c;数据安全事件频发&#xff0c;业务数据不可见、不可视&#xff0c;导致业务数据被第三方利用、泄露的风险长期存在且无解。同时&#xff0c;随着监管力度的加大&#xff0c;数据安全处罚事件逐年变多&#xff0c;2023年更是呈现出爆发式增长的趋势。 在这样…

UPLOAD LABS | UPLOAD LABS 靶场初识

关注这个靶场的其它相关笔记&#xff1a;UPLOAD LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;UPLOAD LABS 靶场简介 UPLOAD LABS 靶场是一个专门用于学习文件上传漏洞攻击和防御的靶场。它提供了一系列文件上传漏洞的实验环境&#xff0c;用于帮助用户了解文件上传漏洞的…

单例模式入门

单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 它的运作方式是这样的&#xff1a; 如果你创建了一个对象&#xff0c; 同时过一会儿后你决定再创建一个新对象&#xff0c; 此时你会获得之前已创建的…

【网络安全设备系列】12、态势感知

0x00 定义&#xff1a; 态势感知&#xff08;Situation Awareness&#xff0c;SA&#xff09;能够检测出超过20大类的云上安全风险&#xff0c;包括DDoS攻击、暴力破解、Web攻击、后门木马、僵尸主机、异常行为、漏洞攻击、命令与控制等。利用大数据分析技术&#xff0c;态势感…

(vue)启动项目报错The project seems to require pnpm but it‘s not installed

(vue)启动项目报错The project seems to require pnpm but it’s not installed 原因 该错误信息表明你的项目需要使用 pnpm 作为包管理工具&#xff0c;但系统中尚未安装 pnpm。 解决方法 【1】删除pnpm.lock 【2】npm install -g pnpm 之后再重新启动 yarn报错&#xff0…

OminiControl:一个新的FLUX通用控制模型,单个模型实现图像主题控制和深度控制

之前的文章中和大家介绍过Flux团队开源了一系列工具套件&#xff0c;感兴趣的小伙伴可以点击下面链接阅读~ AI图像编辑重大升级&#xff01;FLUX.1 Tools发布&#xff0c;为创作者提供了更强大的控制能力。 OminiControl 也开源了其可控生成模型。OminiControl 是一个最小但功…

vue3使用 element-plus图标el-icon-search不生效

使用el-icon-search图标不生效 源代码&#xff1a;<!-- 添加搜索按钮 --> <el-button type"primary" icon"el-icon-search" click"handleSearchByCode" > 搜索 </el-button> 原因&#xff1a;vue3不能直接使用el-icon-search…

分层架构 IM 系统之 Entry 设计实现

在分层架构中&#xff0c;Entry 向客户端提供了 TCP 长连接的接入能力&#xff0c;并对这些长连接的活性进行保活维护&#xff08;详见 分层架构 IM 系统之架构解读&#xff09;&#xff0c;所以在 Entry 服务内部有两个最核心的数据结构&#xff1a; Map<uid, fd>&#…

git rebase-优雅合并与修改提交

文章目录 简介rebase用于合并使用rebase修改提交cherry-pick 简介 在Git核心概念图例与最常用内容操作(reset、diff、restore、stash、reflog、cherry-pick)中我们已经介绍了git的最常用实用的命令。 在上面说的那篇文章中&#xff0c;我们只是简单提了一下rebase。 是因为r…

Android蓝牙架构,源文件目录/编译方式学习

Android 版本 发布时间 代号&#xff08;Codename&#xff09; Android 1.0 2008年9月23日 无 Android 1.1 2009年2月9日 Petit Four Android 1.5 2009年4月27日 Cupcake Android 1.6 2009年9月15日 Donut Android 2.0 2009年10月26日 Eclair Android 2.1 2…

Qt6.8安卓Android开发环境配置

时隔多年&#xff0c;重拾QtCreator下Android开发。发现Qt6下安卓开发环境配置变简单不少&#xff01;只需三步即可在QtCreator下进行Android开发&#xff1a; 一、使用Qt Mantenance Tool进行Android模块的安装&#xff1a; 如果感觉安装网速较慢&#xff0c;可以查看本人另外…

PHP获取安卓APK文件的信息(名称、版本、图标文件等)

最近业务需要一个功能&#xff0c;后台上传apk文件&#xff0c;需要自动获取到此apk的名称、版本、图标、PackageName等信息。网上查了很多资料&#xff0c;看大家都是使用aapt工具来获取信息&#xff0c;不过不能获取图标。后来发现有大神已经封装了一套组件【php-apk-parser】…

扫雷-完整源码(C语言实现)

云边有个稻草人-CSDN博客 在学完C语言函数之后&#xff0c;我们就有能力去实现简易版扫雷游戏了&#xff08;成就感满满&#xff09;&#xff0c;下面是扫雷游戏的源码&#xff0c;快试一试效果如何吧&#xff01; 在test.c里面进行扫雷游戏的测试&#xff0c;game.h和game.c…

Docker:在 ubuntu 系统上生成和加载 Docker 镜像

本文将介绍在 ubuntu系统上进行 Docker 镜像的生成和加载方法和代码。 文章目录 一、下载和安装 docker二、加载 docker 文件三、保存你的镜像四、将镜像上传到云端并通过连接下载和加载 Docker 镜像五、Docker 容器和本地的文件交互5.1 从容器复制文件到本地宿主机5.1.1 单个文…

【排序算法】之快速排序篇

思想&#xff1a; 分而治之&#xff0c;通过选定某一个元素作为基准值&#xff0c;将序列分为两部分&#xff0c;左边的序列小于基准值&#xff0c;右边的序列大于基准值&#xff0c; 然后再分别将左序列和右序列进行递归排序&#xff0c;直至每部分有序。 性质&#xff1a;这…

Unity中的数学应用 之 角色移动中单位化向量的妙用 (小学难度)

最近准备从简单到困难跟几个教程用以加强自己的业务能力&#xff0c;相信很多小伙伴都做过胡闹厨房这一个案例&#xff0c;其实这个案例比较初级&#xff0c;但是也包含了很多平常可能注意不到小细节&#xff0c;所以我就以它为举例&#xff0c;拓展其中的数学知识 CodeMonkey教…

远程视频验证如何改变商业安全

如今&#xff0c;商业企业面临着无数的安全挑战。尽管企业的形态和规模各不相同——从餐厅、店面和办公楼到工业地产和购物中心——但诸如入室盗窃、盗窃、破坏和人身攻击等威胁让安全主管时刻保持警惕。 虽然传统的监控摄像头网络帮助组织扩大了其态势感知能力&#xff0c;但…

简释下oracle的set define的使用场景

我们在使用oracle的时候&#xff0c;有些菜单表存在url字段&#xff0c;url字段中存在这&字符。但我们通过sql语句进行插入表记录的时候&#xff0c;数据库会提示要我们输入变量值。这个时候有些人难免会不知所措&#xff0c;今天告诉大家一个非常简单的办法解决。 一、问…

在ACK集群中自动化执行Ray Job

企业在管理集群资源时面临的主要挑战是任务量庞大而资源有限。为解决这一问题&#xff0c;需要优先将资源分配给关键部门或个人&#xff0c;并保持高度的灵活性以随时调整资源分配。本文将介绍如何提高企业集群资源的利用率&#xff0c;并通过统一的任务管理平台自动化处理来自…

分布式锁的实现原理

作者&#xff1a;来自 vivo 互联网服务器团队- Xu Yaoming 介绍分布式锁的实现原理。 一、分布式锁概述 分布式锁&#xff0c;顾名思义&#xff0c;就是在分布式环境下使用的锁。众所周知&#xff0c;在并发编程中&#xff0c;我们经常需要借助并发控制工具&#xff0c;如 mu…