Elasticsearch - 仅返回数组

时间:2017-11-08 10:51:41

标签: elasticsearch elasticsearch-5

我有以下文件

    {
      "id": 1,
      "store": "xyz",
      "products": [
        {
          "object": {
            "name": "chair",
            "code": "2584"
          },
          "parts": [
            {
              "material": "wood"
            },
            {
              "material": "steel"
            }
          ]
        }
      ]
    },
    {
      "id": 2,
      "store": "abc",
      "products": [
        {
          "object": {
            "name": "chair",
            "code": "2584"
          },
          "parts": [
            {
              "material": "wood"
            },
            {
              "material": "steel"
            }
          ]
        },
        {
          "object": {
            "name": "table",
            "code": "2678"
          },
          "parts": [
            {
              "material": "wood"
            },
            {
              "material": "steel"
            }
          ]
        }
      ]
    }

所以它是这样的:商店列表 - >产品清单 - >零件清单

现在我想查询所有在产品列表中拥有主席的商店,但我不希望在响应中包含所有产品

例如,商店“abc”应该返回查询:

{
 "id": 2,
 "store": "abc",
 "products": [
   {
     "object": {
       "name": "chair",
       "code": "2584"
     },
     "parts": [
       {
         "material": "wood"
       },
       {
         "material": "steel"
       }
     ]
   }
}

目前我的映射是:

"products.object": {
  "type": "object",
  "properties": {
    "code": {
      "type": "text",
      "fielddata": true
    },
    "name": {
      "type": "text",
      "fielddata": true
    }
  }
},
"products.parts": {
  "store": false,
  "type": "long",
  "index": false
},

我应该使用什么类型的查询以及应该如何进行映射?

提前谢谢

编辑:

要添加到我的问题,我的目标是删除所有与匹配数组中的查询不匹配的产品

因此响应应该包含id,变量“store”等等。但不是那些与“椅子”名称不匹配的产品(以回应我的例子)

1 个答案:

答案 0 :(得分:0)

您可以使用条款聚合查询:

{
  "size": 0,
  "query": {
    "bool": {
      "must": {
        "products.object.name": "chair"
      }
    }
  },
  "aggs": {
    "stores_aggregation": {
      "terms": {
        "field": "store"
      }
    }
  }
}

- > size:0确定不返回任何文件。

- >查询将仅按主席

过滤

- >聚合将为您提供包含所有相关商店的存储桶列表,请查看here以获取更多信息。

另一件事,我建议您与Nested Datatype进行嵌套,请参阅我的回答here以了解其中的好处。