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

一、前言

在前面的文章我们学习了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全部实现一遍,希望对有所帮助。

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

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

相关文章

Linux:进程间通信之system V

一、共享内存 进程间通信的本质是让不同的进程看到同一份代码。 1.1 原理 第一步&#xff1a;申请公共内存 为了让不同的进程看到同一份资源&#xff0c;首先我们需要由操作系统为我们提供一个公共的内存块。 第二步&#xff1a;挂接到要通信进程的地址空间中 &#xff…

Vue进阶之单组件开发与组件通信

书接上篇&#xff0c;我们了解了如何快速创建一个脚手架&#xff0c;现在我们来学习如何基于vite创建属于自己的脚手架。在创建一个新的组件时&#xff0c;要在新建文件夹中打开终端创建一个基本的脚手架&#xff0c;可在脚手架中原有的文件中修改或在相应路径重新创建&#xf…

【Linux网络编程】第四弹---构建UDP服务器与字典翻译系统:源码结构与关键组件解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、UdpServer.hpp 1.1、函数对象声明 1.2、Server类基本结构 1.3、构造函数 1.4、Start() 2、Dict.hpp…

数字IC后端设计实现之分段长clock tree经典案例

最近发现很多读者问到分段长clock tree的做法&#xff0c;小编今天给大家分享几个SoC芯片中复杂时钟结构设计的分段长clock tree的应用案例。希望对各位的学习和工作有所助益。 数字后端设计实现之时钟树综合实践篇 数字IC后端实现专家都具备哪些技能&#xff1f;&#xff08…

计算机毕业设计Spark+SpringBoot旅游推荐系统 旅游景点推荐 旅游可视化 旅游爬虫 景区客流量预测 旅游大数据 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

EasyMedia播放rtsprtmp视频流

学习链接 MisterZhang/EasyMedia - gitee地址 EasyMedia转码rtsp视频流flv格式&#xff0c;hls格式&#xff0c;H5页面播放flv流视频 文章目录 学习链接介绍步骤easydarwin启动rtsp服务&#xff0c;ffmpeg推送摄像头&#xff08;模拟rtsp视频流&#xff09;nginx添加rtmp支持…

【Linux】开启你的Linux之旅:初学者指令指南

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01; 在 Linux 开发中&#xff0c;GDB 调试器和 Git 版本控制工具是开发者必备的利器。GDB 帮助快速定位代码问题&#xff0c;Git 则提供高效的版本管理与协作支持。本指南将简明介绍两者的核心功能与使用技巧&…

SpringBoot-问题排查 Controller全局打印入参,返回值,响应时间,异常日志

问题: 想要打印每次请求的入参,返回值,响应时间,异常日志,如果给每个方法挨个添加打印日志非常麻烦 解决方案: 使用切面的方式将所有的Controller每个方法加入切入点使用环绕通知的方式可以在切入点执行前后执行切面,符合我们的需求在方法执行前后打印相关日志忽略LogIgnore注解…

mysql数据库varchar截断问题

用了这么多年mysql数据库&#xff0c;才发现varchar是可以截断的&#xff0c;而且是在我们线上数据库。个人觉得dba的这个设置是非常有问题的&#xff0c;用户往数据库里存东西&#xff0c;就是为了以后用的&#xff0c;截断了存放&#xff0c;数据不完整&#xff0c;就用不了了…

C++草原三剑客之一:继承

为王的诞生献上礼炮吧&#xff01; 目录 1 继承的概念及其定义 1.1 继承的概念 1.2 继承的定义 1.2.1 定义格式 1.2.2 继承方式以及继承基类成员访问方式的变化 1.3 继承类模板 2 基类和派生类之间的转换 3 继承中的作用域 3.1 隐藏规则 3.2 两道考察继承作用的相关…

Crash-SQLiteDiskIOException

目录 相关问题 日志信息 可能原因 问题排查 相关问题 蓝牙wifi无法使用 日志信息 可能原因 磁盘空间不足&#xff1a;当设备上的可用存储空间不足时&#xff0c;SQLite无法完成磁盘I/O操作&#xff0c;从而导致SQLiteDiskIOException。 数据库文件损坏&#xff1a;如果数…

6.824/6.5840 Lab 1: Lab 3: Raft

漆昼中温柔的不像话 静守着他的遗憾啊 旧的摇椅吱吱呀呀停不下 风卷走了满院的落叶落花 ——暮色回响 完整代码见&#xff1a; https://github.com/SnowLegend-star/6.824 在完成Lab之前&#xff0c;务必把论文多读几遍&#xff0c;力求完全理解Leader选举、log日志等过程。 …

【C++动态规划 BFS 博弈】3283. 吃掉所有兵需要的最多移动次数|2473

本文涉及知识点 C动态规划 CBFS算法 数学 博弈 LeetCode3283. 吃掉所有兵需要的最多移动次数 给你一个 50 x 50 的国际象棋棋盘&#xff0c;棋盘上有 一个 马和一些兵。给你两个整数 kx 和 ky &#xff0c;其中 (kx, ky) 表示马所在的位置&#xff0c;同时还有一个二维数组 …

6.824/6.5840 Lab 2: Key/Value Server

故事里能毁坏的只有风景 谁也摧毁不了我们的梦境 弦月旁的流星划过了天际 我许下 的愿望 该向谁 去说明 ——我是如此相信 完整代码见&#xff1a; https://github.com/SnowLegend-star/6.824 还是那句话&#xff0c;尽量只是参考思路而不是照抄 先阅读几遍实验说明的Introd…

Linux-异步IO和存储映射IO

异步IO 在 I/O 多路复用中&#xff0c;进程通过系统调用 select()或 poll()来主动查询文件描述符上是否可以执行 I/O 操作。而在异步 I/O 中&#xff0c;当文件描述符上可以执行 I/O 操作时&#xff0c;进程可以请求内核为自己发送一个信号。之后进程就可以执行任何其它的任务…

R 语言科研绘图第 1 期 --- 折线图-基础

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

企业中数据防泄漏如何防范?有哪些防泄密措施?

企业数据不仅是业务运营的核心&#xff0c;也是企业竞争力的关键所在。 然而&#xff0c;随着信息技术的快速发展&#xff0c;数据泄露的风险也随之增加。 数据一旦泄露&#xff0c;不仅可能导致企业经济损失&#xff0c;还可能损害企业声誉&#xff0c;甚至引发法律纠纷。 …

汽车控制软件下载移动管家手机控车一键启动app

移动管家手机控制汽车系统是一款实现车辆远程智能控制的应用程序‌。通过下载并安装特定的APP&#xff0c;用户可以轻松实现以下功能&#xff1a;‌远程启动与熄火‌&#xff1a;无论身处何地&#xff0c;只要有网络&#xff0c;即可远程启动或熄火车辆&#xff0c;提前预冷或预…

基于事件驱动构建 AI 原生应用

作者&#xff1a;寒斜 AI 应用在商业化服务的阶段会面临诸多挑战&#xff0c;比如更快的服务交付速度&#xff0c;更实时、精准的结果以及更人性化的体验等&#xff0c;传统架构限制于同步交互&#xff0c;无法满足上述需求&#xff0c;本篇文章给大家分享一下如何基于事件驱动…

如何查看阿里云ddos供给量

要查看阿里云上的 DDoS 攻击量&#xff0c;你可以通过阿里云的 云盾 DDoS 防护 服务来进行监控和查看攻击数据。阿里云提供了详细的流量监控、攻击日志以及攻击趋势分析工具&#xff0c;帮助用户实时了解 DDoS 攻击的情况。以下是九河云总结的查看 DDoS 攻击量的步骤&#xff1…