es 中 terms set 使用

在 Elasticsearch 中,terms_set 查询通常用于在一个字段上进行多值匹配,并支持设置一个条件(例如最小匹配数量),让查询结果更具灵活性。为了展示如何使用 terms_set 查询,我们首先会创建一个索引,写入一些数据,然后演示如何进行查询。

1. 创建索引和写入数据

首先,假设我们有一个关于 articles(文章)的索引,每个文档包含字段 tags(标签),我们希望查询文档中的标签是否包含给定的多个值。

创建索引

假设我们的索引名为 articles,并且每个文档包含字段 tags(多个标签值)。

json 复制代码
PUT /articles
{
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "tags": { "type": "keyword" }
    }
  }
}

在上述示例中,我们定义了一个名为 articles 的索引,其中 tags 字段是 keyword 类型,因为我们想要存储和查询标签。

写入数据

接下来,我们写入一些数据。每个文档包含文章标题和相关的标签。

json 复制代码
POST /articles/_bulk
{ "index": { "_id": 1 } }
{ "title": "Tech News Today", "tags": ["tech", "news", "AI"] }
{ "index": { "_id": 2 } }
{ "title": "Sports Highlights", "tags": ["sports", "news", "football"] }
{ "index": { "_id": 3 } }
{ "title": "Latest in AI", "tags": ["tech", "aAI"] }
{ "index": { "_id": 4 } }
{ "title": "Football Updates", "tags": ["sports", "football"] }
{ "index": { "_id": 5 } }
{ "title": "Tech Innovations", "tags": ["tech", "innovation"] }

在这个例子中,我们为不同的文章指定了多个标签,如 techsportsnewsAI 等。

2. 使用 terms_set 查询

现在,我们将使用 terms_set 查询来查找至少匹配给定标签集的文档。比如,我们希望找到那些标签字段中至少包含 technewsAI 中的两个标签的文档。

查询示例
json 复制代码
POST /articles/_search
{
  "query": {
    "terms_set": {
      "tags": {
        "terms": ["tech", "news", "AI"],
        "minimum_should_match_script": {
          "source": "Math.min(params.num_terms, 2)"
        }
      }
    }
  }
}
解释:
  • terms_set : 查询的目标字段是 tags
  • terms : 这里列出的是我们要匹配的标签集合:["tech", "news", "AI"]
  • minimum_should_match_script : 使用脚本来设置条件,要求文档的 tags 字段至少包含集合中的两个标签。Math.min(params.num_terms, 2) 的意思是,"返回包含至少两个标签的文档"。

3. 查询结果

假设查询成功执行,以下是结果:

json 复制代码
{
  "took" : 13,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 3.810946,
    "hits" : [
      {
        "_index" : "articles",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 3.810946,
        "_source" : {
          "title" : "Tech News Today",
          "tags" : [
            "tech",
            "news",
            "AI"
          ]
        }
      }
    ]
  }
}

在这个结果中,符合查询条件的文档是:

  • 文档 1tags 包含 technewsAI,至少包含两个标签。
  • 文档 3tags 包含 techAI,至少包含两个标签。

5. 总结

  • terms_set 查询在处理多值字段时非常有用,特别是当你希望在一个字段中匹配多个值,并且可以灵活控制匹配条件时。
  • terms 参数用于指定查询的多个值,minimum_should_match_script 则用于自定义最小匹配数量。
  • 这种查询方法非常适合需要对多值条件进行动态调整的情况,比如在推荐系统或复杂筛选条件下使用。
相关推荐
weixin_307779131 小时前
在AWS上使用KMS客户端密钥加密S3文件,同时支持PySpark读写和Snowflake导入
大数据·数据仓库·python·spark·云计算
weixin_307779138 小时前
Spark Streaming的背压机制的原理与实现代码及分析
大数据·python·spark
想做富婆12 小时前
hive:基本数据类型,关于表和列语法
大数据·hive·hadoop
梦醒沉醉13 小时前
单机伪分布Hadoop详细配置
大数据·hadoop·分布式
小Tomkk14 小时前
大数据相关职位介绍之一(数据分析,数据开发,数据产品经理,数据运营)
大数据·数据分析·数据开发·数据运营·数据产品经理
UI设计兰亭妙微14 小时前
大屏 UI 设计风格的未来趋势
大数据
乙卯年QAQ19 小时前
【Elasticsearch】Elasticsearch的查询
大数据·elasticsearch·搜索引擎
无敌小田田19 小时前
es数据同步
数据库·sql·elasticsearch
XianxinMao21 小时前
科技巨头AI投资引领未来增长
大数据·人工智能·科技
言之。21 小时前
【Spark速通】
大数据·分布式·spark