探索 Elasticsearch 8.X Terms Set 检索的应用与原理

1、Terms Set 检索简介

Terms Set查询是Elasticsearch中一种强大的查询类型,主要用于处理多值字段中的文档匹配。

其核心功能在于,它可以检索至少匹配一定数量给定词项的文档,其中匹配的数量可以是固定值,也可以是基于另一个字段的动态值。这种查询方式在处理具有多个属性、分类或标签的复杂数据时非常有用。

2、Terms Set 检索产生背景

Terms Set查询是Elasticsearch 6.1版本中引入的新功能。在6.1版本之前,Elasticsearch提供了多种查询类型,但在处理多值字段时,用户可能需要编写更复杂的查询或使用脚本来实现特定的匹配条件。

引入Terms Set查询的主要目的是为了简化这类场景下的查询处理。使用Terms Set查询,用户可以轻松地找到至少匹配一定数量给定词项的文档,同时支持基于其他字段或脚本动态计算匹配数量。这种查询方式在处理具有多个属性、分类或标签的复杂数据时非常有用。

3、Terms Set 检索应用场景

Terms Set查询在处理多值字段和特定匹配条件时非常有用。

以下是一些常见的应用场景:

标签系统

在具有标签系统的应用中,如博客、社交媒体或新闻网站,用户可能会为内容(如文章、帖子或产品)分配多个标签。使用Terms Set查询,可以找到至少具有一定数量给定标签的内容。这对于筛选和推荐功能非常有用。

搜索引擎

在搜索引擎中,用户可能会输入多个关键词来查找相关内容。使用Terms Set查询,可以根据文档与给定关键词的匹配程度对结果进行排序。例如,可以找到至少匹配用户输入关键词一半数量的文档。

电子商务

在电子商务应用中,产品可能具有多个属性,如颜色、尺寸或品牌。使用Terms Set查询,可以找到同时满足多个属性条件的产品。例如,可以找到至少具有2个指定颜色和3个指定尺寸的产品。

文档管理系统

在文档管理系统中,文档可能具有多个分类或标签。使用Terms Set查询,可以根据文档的分类或标签匹配程度进行筛选。例如,可以找到与给定分类或标签至少匹配一定数量的文档。

技能匹配

在招聘或求职应用中,候选人可能具有多个技能。使用Terms Set查询,可以找到至少具有一定数量给定技能的候选人。这对于筛选和推荐合适的候选人非常有用。总之,Terms Set查询在处理具有多个属性、分类或标签的复杂数据时非常有用。通过灵活地设置匹配数量条件,可以轻松地找到满足特定要求的文档。

4、Terms Set 检索的工作原理

Terms Set查询的基本语法如下:

{
  "query": {
    "terms_set": {
      "<字段名>": {
        "terms": ["<词项1>", "<词项2>", ...],
        "minimum_should_match_field": "<匹配数量字段名>",
        "minimum_should_match_script": {
          "source": "<脚本>"
        }
      }
    }
  }
}

Terms Set查询的工作原理可以分为以下几个步骤:

  • 指定要查询的字段名,这个字段通常是一个多值字段,如数组或集合。

  • 提供一组词项,用于在指定字段中进行匹配。

  • 设置匹配数量的条件,可以有两种方式(二者不可兼得,只能选择其中一个):

    • 通过 minimum_should_match_field 参数指定一个包含匹配数量的字段名。

    • 使用 minimum_should_match_script 参数提供一个脚本,该脚本可以动态计算匹配数量。

  • Elasticsearch会检索匹配给定词项数量要求的文档,并将它们作为查询结果返回。

5、Terms Set 检索应用示例

假设我们有一个电影数据库,每部电影都有多个标签。现在,我们希望找到同时具有一定数量给定标签的电影。

以下是一个使用Terms Set查询的例子:

5.1 数据准备

首先,创建一个名为movies的索引:

PUT movies
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "tags": {
        "type": "keyword"
      },
      "tags_count": {
        "type": "integer"
      }
    }
  }
}

然后,向索引中添加一些电影数据:

POST /movies/_bulk
{"index":{"_id":1}}
{"title":"电影1","tags":["喜剧","动作","科幻"],"tags_count":3}
{"index":{"_id":2}}
{"title":"电影2","tags":["喜剧","爱情","家庭"],"tags_count":3}
{"index":{"_id":3}}
{"title":"电影3","tags":["动作","科幻","喜剧"],"tags_count":3}

5.2 使用Terms Set 检索电影

现在,我们希望找到至少具有2个给定标签("喜剧"、"动作"和"科幻")的电影。我们可以使用Terms Set查询来实现这个需求:

基于minimum_should_match_field 检索

GET /movies/_search
{
  "query": {
    "terms_set": {
      "tags": {
        "terms": ["喜剧", "动作", "科幻"],
        "minimum_should_match_field": "tags_count"
      }
    }
  }
}

上述代码使用 terms_set 查询,在名为 movies 的索引中检索满足动态匹配数量要求的电影,匹配数量由 tags_count 字段决定,查询标签包括"喜剧"、"动作"和"科幻"。返回结果如下,文档1被召回。

e181be0036475f0d659f7d13a87435c2.png

再看如下的检索。

基于minimum_should_match_script 检索

GET /movies/_search
{
  "query": {
    "terms_set": {
      "tags": {
        "terms": [
          "喜剧",
          "动作",
          "科幻"
        ],
        "minimum_should_match_script": {
          "source": "doc['tags_count'].value * 0.7"
        }
      }
    }
  }
}

如上检索从名为 movies 的索引中检索至少匹配给定标签("喜剧"、"动作"和"科幻")总数70%数量要求的电影,匹配数量由自定义脚本doc['tags_count'].value * 0.7动态计算。“_id”为1和“_id”为3的两个文档被召回。

fe11f768e185511596fb2360dac9e507.png

6、小结

Terms Set查询是Elasticsearch中一种非常强大的查询方式,适用于处理具有多个属性、分类或标签的复杂数据。

通过灵活地设置匹配数量条件,我们可以轻松地找到满足特定要求的文档。

然而,需要注意的是,使用Terms Set查询时可能会遇到性能问题,特别是在处理大量数据时。为了提高查询性能,可以考虑对数据进行预处理,例如使用聚类算法将标签分组,然后根据分组查询文档。

推荐阅读

  1. 全网首发!从 0 到 1 Elasticsearch 8.X 通关视频

  2. 重磅 | 死磕 Elasticsearch 8.X 方法论认知清单

  3. 如何系统的学习 Elasticsearch ?

  4. 2023,做点事

30caa489725722e70ecc245df3ef22b0.jpeg

更短时间更快习得更多干货!

和全球 近2000+ Elastic 爱好者一起精进!

f9f1206dc1cf417cd9722cd49af6609c.gif

抢先一步学习进阶干货!

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

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

相关文章

抖音商城小程序搭建的注意事项

抖音商城小程序已经成为了越来越多电商企业的选择&#xff0c;毕竟它具有强大的用户资源和社交传播力。但是&#xff0c;在搭建抖音商城小程序的过程中&#xff0c;还有一些需要注意的事项。 1、制定明确的策略和目标 在搭建抖音商城小程序前&#xff0c;必须事先制定明确的策…

三步配置轻量级服务器nginx

这里写目录标题 一 nginx及其应用场景1.什么是nginx2.应用场景背诵 二 nginx的配置安装1.选择nginx版本2. 安装配置环境3.安装nginx4.启动nginx 三 访问 一 nginx及其应用场景 1.什么是nginx 一款轻量级的Web服务器&#xff0c;反向代理服务器&#xff0c;以及电子邮件代理服…

java获取resources路径的方法

我们在写程序的时候&#xff0c;有时候会发现代码不能正常运行&#xff0c;出现提示异常的问题&#xff0c;这就说明我们的代码没有执行完&#xff0c;也就是没有 resource&#xff0c;其实遇到这种情况&#xff0c;我们只需要把代码重新执行一遍即可。 在 java中是可以实现 re…

实验六 触发器与存储过程

实验六 触发器与存储过程 目录 实验六 触发器与存储过程 1、SQL触发器&#xff1a;删除学生数据题目代码题解 2、SQL触发器&#xff1a;创建成绩表插入触发器题目代码题解 3、 SQL存储过程&#xff1a;查询订单题目代码题解 4、SQL存储过程&#xff1a;建立存储过程&#xff0c…

浅析S32K324的时钟树

S32K3XX系列的时钟树梳理 如下图为S32K3XX系列的时钟树图&#xff1a; 一、时钟源 时钟源说明FIRC快速内部RC时钟源SIRC慢速内部RC时钟源FXOSC快速外部晶振时钟源SXOSC慢速外部晶振时钟源 S32K3系列的mcu有4个时钟源如上表。 二、FIRC&#xff08;快速内部RC时钟源&#…

【A200】 TX1核心 JetPack4.6.2版本如何修改DTB文件测试全部SPI

大家好&#xff0c;我是虎哥&#xff0c;很长时间没有发布新内容&#xff0c;主要是这段时间集中精力&#xff0c;研究DTB设备树的修改&#xff0c;以适配不同载板&#xff0c;同时也是专门做了一个TX1&TX2核心&#xff0c;双网口&#xff0c;可以使用SPI 扩展CAN接口的载板…

Actuators + jolokia

Actuators + jolokia Jolokia造成的XXE漏洞 首先我们查看我们当前环境http://x.x.x.x/jolokia/list地址,是否存在reloadByURL这个方法, 这个方法是造成RCE的关键。因为logback组件提供的reloadByURL操作使我们可以从外部URL重新加载日志配置 创建logback.xml和file.dtd文件…

【神经网络】tensorflow实验9--分类问题

1. 实验目的 ①掌握逻辑回归的基本原理&#xff0c;实现分类器&#xff0c;完成多分类任务&#xff1b; ②掌握逻辑回归中的平方损失函数、交叉熵损失函数以及平均交叉熵损失函数。 2. 实验内容 ①能够使用TensorFlow计算Sigmoid函数、准确率、交叉熵损失函数等&#xff0c…

tomcat集群下的session共享和负载均衡

环境 操作系统&#xff1a;windows tomcat1&#xff1a;Apache Tomcat/7.0.52&#xff08;8085&#xff09; tomcat2&#xff1a;Apache Tomcat/7.0.52&#xff08;8086&#xff09; jre&#xff1a;1.7.0_80 nginx&#xff1a;nginx-1.20.1&#xff08;8070&#xff09; redis…

人工智能洗稿-免费自媒体洗稿工具

文字洗稿 文字洗稿是指通过修改、重组、删除、替换等手段对文本进行优化、清理和调整&#xff0c;以达到改善文章质量、增加独特性和提高可读性的目的。文字洗稿是自媒体行业的一个重要需求&#xff0c;尤其是在批量撰写文章或需要大量修改文本的情况下。文字洗稿分为自动洗稿…

如何用ChatGPT搭建品牌文本体系?(品牌名+slogan+品牌故事)

该场景对应的关键词库&#xff08;26个&#xff09;&#xff1a; 品牌名、奶茶、中文名、情感联想度、饮料、价值观/理念、发音、slogan、产品功能导向、行业性质导向、经营理念导向、消费者观念导向、口语化、修辞手法、品牌故事、创始人初心品牌故事、里程碑事件故事、产品初…

Intellij中使用Spotless 格式化代码

Spotless简介 在一些大型项目或开源项目&#xff0c;由于开发人员太多&#xff0c;导致各个代码格式不统一。会让整体项目的代码可读性变差。统一代码格式使用maven中的Spotless插件就是不错的选择。 Spotless 是一个代码格式化工具&#xff0c;它有以下功能&#xff1a; 支…

第6章 静态代理

第6章 静态代理 把所有静态资源的访问改为访问nginx&#xff0c;而不是访问tomcat&#xff0c;这种方式叫静态代理。因为nginx更擅长于静态资源的处理&#xff0c;性能更好&#xff0c;效率更高。 ​ 所以在实际应用中&#xff0c;我们将静态资源比如图片、css、html、js等交…

helm和chart

Helm helm是Kubernetes 应用的包管理工具&#xff0c;主要用来管理 Charts&#xff0c;类似Linux系统的yum。Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata&#xff0c;以便于应用程序的分发。 he…

keil移植linux(makefile)

文章目录 运行环境&#xff1a;1.1 freeRTOS_LED工程移植1)修改cubeMX配置2)setting设置3)launch设置4)修改makefile5)修改代码6)实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32f427IIH6 stlink 9-24v可调电源 robomaster A 板 1.1 freeRTOS_L…

第二章——进程与线程(上)

上船不思岸上人&#xff0c;下船不提船上事 文章目录 2.1.1 进程的概念&#xff0c;组成&#xff0c;特征知识总览进程的概念进程的组成——PCB程序是如何运行的进程的组成进程的特征知识回顾 2.1.2 进程的状态与转换&#xff0c;进程的组织知识总览创建态&#xff0c;就绪态运…

yolov5 8系列 labelme数据标注 并生成训练数据集

yolov5 8系列 labelme数据标注 数据集生成终极教程 一.数据集准备二.转换为yolo 数据集 一.数据集准备 创建一个data 文件夹在data文件夹下创建一个images 文件夹将所有图片数据放入images文件夹下 使用labelme标注数据 python环境下使用 pip install labelme 安装labelme在c…

缓存击穿,穿透,雪崩

一、缓存击穿 单个热点key&#xff0c;在不停的扛着大并发&#xff0c;在这个key失效的瞬间&#xff0c;持续的大并发请求就会击破缓存&#xff0c;直接请求到数据库 解决方案 使用互斥锁&#xff08;Mutex Key&#xff09;&#xff0c;只让一个线程构建缓存&#xff0c;其他…

Golang中的运算符

目录 运算符 算术运算符 代码案例&#xff1a; 关系运算符 代码案例&#xff1a; 逻辑运算符 代码案例&#xff1a; 位运算符 代码案例&#xff1a; 赋值运算符 代码案例&#xff1a; 其他运算符 运算符 算术运算符 Go语言中的算术运算符包括加、减、乘、除和取模…

4.2和4.3、MAC地址、IP地址、端口

计算机网络等相关知识可以去小林coding进行巩固&#xff08;点击前往&#xff09; 4.2和4.3、MAC地址、IP地址、端口 1.MAC地址的简介2.IP地址①IP地址简介②IP地址编址方式③A类IP地址④B类IP地址⑤C类IP地址⑥D类IP地址⑧子网掩码 3.端口①简介②端口类型 1.MAC地址的简介 …