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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 探索 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被召回。

再看如下的检索。

基于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的两个文档被召回。

6、小结

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

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

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

推荐阅读


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

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

抢先一步学习进阶干货!


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
56 3
|
3月前
|
机器学习/深度学习 存储 监控
Elasticsearch 在日志分析中的应用
【9月更文第2天】随着数字化转型的推进,日志数据的重要性日益凸显。日志不仅记录了系统的运行状态,还提供了宝贵的洞察,帮助企业改进产品质量、优化用户体验以及加强安全防护。Elasticsearch 作为一个分布式搜索和分析引擎,因其出色的性能和灵活性,成为了日志分析领域的首选工具之一。本文将探讨如何使用 Elasticsearch 作为日志分析平台的核心组件,并详细介绍 ELK(Elasticsearch, Logstash, Kibana)栈的搭建和配置流程。
368 4
|
4月前
|
存储 API 数据库
检索服务elasticsearch索引(Index)
【8月更文挑战第23天】
73 6
|
4月前
|
存储 负载均衡 监控
检索服务elasticsearch节点(Node)
【8月更文挑战第23天】
65 5
|
4月前
|
存储 监控 负载均衡
检索服务elasticsearch集群(Cluster)
【8月更文挑战第23天】
72 3
|
9天前
|
弹性计算 运维 Serverless
超值选择:阿里云Elasticsearch Serverless在企业数据检索与分析中的高性能与灵活性
本文介绍了阿里云Elasticsearch Serverless服务的高性价比与高度弹性灵活性。
|
1月前
|
存储 SQL 监控
|
1月前
|
自然语言处理 监控 数据可视化
|
2月前
|
人工智能
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
182 2
|
3月前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用