在结果集中获取elasticsearch嵌套对象的值

时间:2013-11-22 08:10:28

标签: nested elasticsearch

我正在尝试使用elasticsearch为电子商务网站构建方面导航。

商店产品可以有多种变体。我想到的文档结构如下所示:

PUT /products_test/product/1
{
  "id": "1",
  "manufacturer": "foobar",
  "categories": [
                  "28554568",
                  "28554577",
                  "28554578"
  ],
  "variants": [
    {
      "id": "1_a",
      "color": "blue",
      "size": "L"
      "price": "67.99"
    },
    {
      "id": "1_b",
      "color": "red",
      "size": "L"
      "price": "69.99"
    }
  ]
}

我将变体定义为嵌套类型。这样,以下查询将返回包含与过滤器匹配的变体的所有文档:

POST /products_test/product/_search
{
  "query": {
    "filtered": {
       "query": {"match_all": {}},
       "filter": {
          "and": [
            {"term": {"categories": "28554568"}},
            {"terms": {
              "variants.color": [
                "red"
              ]
            }}
          ]
       }
    }
  }
}

现在,我真的想获得与过滤器匹配的变体的ID,以便在类别页面上显示该产品的变体。因此,在示例的情况下,我希望返回第二个变量(1_b)的id。我只获取结果集中返回的文档的id。有没有办法从嵌套对象中定义一个值也可以返回?

1 个答案:

答案 0 :(得分:1)

目前无法获取与查询匹配的嵌套文档。这是一个known issue,并且已经给予修复它的工作/思考。该问题的当前状态是需要重构Elasticsearch的获取阶段以支持此功能。

这很重要并且会发生,因为重构也会使弹性搜索的其他部分受益,但它是一个主要的重构。当它可用时,目前没有ETA。

我会考虑对数据进行非规范化,以便每个变体包含“根对象”数据,然后在客户端内进行分组。

或者,您可以调查父/子映射但是类似的限制适用(无法确定哪个子项与has_child查询匹配),但它确实提供了更多的灵活性,因为子项是可以搜索的独立文档