在 Elasticsearch 中,terms_set
查询通常用于在一个字段上进行多值匹配,并支持设置一个条件(例如最小匹配数量),让查询结果更具灵活性。为了展示如何使用 terms_set
查询,我们首先会创建一个索引,写入一些数据,然后演示如何进行查询。
1. 创建索引和写入数据
首先,假设我们有一个关于 articles
(文章)的索引,每个文档包含字段 tags
(标签),我们希望查询文档中的标签是否包含给定的多个值。
创建索引
假设我们的索引名为 articles
,并且每个文档包含字段 tags
(多个标签值)。
PUT /articles
{
"mappings": {
"properties": {
"title": { "type": "text" },
"tags": { "type": "keyword" }
}
}
}
在上述示例中,我们定义了一个名为 articles
的索引,其中 tags
字段是 keyword
类型,因为我们想要存储和查询标签。
写入数据
接下来,我们写入一些数据。每个文档包含文章标题和相关的标签。
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"] }
在这个例子中,我们为不同的文章指定了多个标签,如 tech
、sports
、news
、AI
等。
2. 使用 terms_set
查询
现在,我们将使用 terms_set
查询来查找至少匹配给定标签集的文档。比如,我们希望找到那些标签字段中至少包含 tech
、news
、AI
中的两个标签的文档。
查询示例
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. 查询结果
假设查询成功执行,以下是结果:
{
"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"
]
}
}
]
}
}
在这个结果中,符合查询条件的文档是:
- 文档 1:
tags
包含tech
、news
、AI
,至少包含两个标签。 - 文档 3:
tags
包含tech
、AI
,至少包含两个标签。
5. 总结
terms_set
查询在处理多值字段时非常有用,特别是当你希望在一个字段中匹配多个值,并且可以灵活控制匹配条件时。terms
参数用于指定查询的多个值,minimum_should_match_script
则用于自定义最小匹配数量。- 这种查询方法非常适合需要对多值条件进行动态调整的情况,比如在推荐系统或复杂筛选条件下使用。