You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从嵌套对象数组中获取基于标签搜索的唯一玩具结果?

基于标签搜索并去重嵌套玩具对象的解决方案

我有一批包含嵌套玩具数组的文档,玩具对象的tags属性是逗号分隔的字符串,不同文档里可能存在相同ID的玩具。示例数据如下:

[
  {
    "documentId": 1,
    "toys": [
      {
        "id": "A",
        "tags": "foo, bar, baz"
      },
      {
        "id": "B",
        "tags": "test"
      },
      {
        "id": "C",
        "tags": "bar"
      }
    ]
  },
  {
    "documentId": 2,
    "toys": [
      {
        "id": "A",
        "tags": "foo, bar, baz"
      },
      {
        "id": "B",
        "tags": "test"
      }
    ]
  }
]

需求是根据用户输入的标签(比如"bar")搜索,返回唯一的玩具对象列表(比如搜索"bar"时返回玩具A和C)。但当前的查询无法实现按玩具ID去重,需要调整。

解决思路

核心是通过聚合按玩具ID分组,确保每个ID只返回一个玩具对象,同时过滤出符合标签条件的玩具:

  • 先用nested查询过滤出包含目标标签的文档;
  • 在嵌套聚合中,先过滤出符合标签条件的玩具对象;
  • 按toys.id做terms聚合实现去重;
  • 在每个ID分组下,用top_hits获取该玩具的完整信息,只取1条结果即可。

调整后的查询示例

GET my-index/_search
{
  "size": 0,
  "query": {
    "nested": {
      "path": "toys",
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "toys.tags": {
                  "query": "bar",
                  "operator": "AND"
                }
              }
            },
            {
              "match_phrase": {
                "toys.tags": "bar"
              }
            }
          ],
          "minimum_should_match": 1
        }
      }
    }
  },
  "aggs": {
    "nested_toys": {
      "nested": {
        "path": "toys"
      },
      "aggs": {
        "filter_tags": {
          "filter": {
            "bool": {
              "should": [
                {
                  "match": {
                    "toys.tags": {
                      "query": "bar",
                      "operator": "AND"
                    }
                  }
                },
                {
                  "match_phrase": {
                    "toys.tags": "bar"
                  }
                }
              ],
              "minimum_should_match": 1
            }
          },
          "aggs": {
            "unique_toys": {
              "terms": {
                "field": "toys.id.keyword",
                "size": 1000  // 根据实际玩具数量调整
              },
              "aggs": {
                "toy_details": {
                  "top_hits": {
                    "size": 1,
                    "_source": ["toys.id", "toys.tags"]
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

关键说明

  • 外层nested查询先筛选出所有包含目标标签的文档,缩小聚合范围;
  • filter_tags聚合再次过滤出符合标签条件的玩具对象,避免文档中无关玩具被纳入聚合;
  • unique_toys按toys.id.keyword分组(用keyword确保ID精确匹配),实现玩具ID级别的去重;
  • toy_details用top_hits获取每个分组下的第一条玩具数据,保证结果唯一性。

优化建议

  • 如果toys.tags是逗号分隔的字符串,建议索引时配置pattern analyzer按逗号拆分标签,或者将tags字段设为keyword数组类型,这样标签匹配会更精准,避免部分匹配的问题;
  • 根据实际玩具总数调整terms聚合的size参数,确保能覆盖所有需要返回的唯一玩具ID。

内容的提问来源于stack exchange,提问作者Robert Swilley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:58:11