按数组中的id过滤,仅返回ID为Elasticsearch 1.7的项目

时间:2017-04-14 11:05:08

标签: elasticsearch

如何按offers字段过滤id数组并返回带搜索ID的结果对象?

当前搜索通过商品数据中的ID正确查找数据,但它也会返回所有对象:

GET activities/activity/_search
{
   "query": {
      "filtered": {
         "filter": {
            "bool": {
               "must": [
                  {
                    "term": {
                      "offers.id": "12"
                    }
                  }
               ]
            }
         }
      }
   }
}

目前的结果,我想过滤优惠,只获得"id": 12

"hits": [
   {
      "_index": "activities",
      "_type": "activity",
      "_id": "AVtr4-UV81wMr8KFD246",
      "_score": null,
      "_source": {
         "offers": [
            {
               "title": "merge",
               "id": 11
            },
            {
               "title": "order test",
               "id": 12
            }
         ],
         "event": "candidate_remove",
         "created_at": "2017-04-14T09:55:49.115174Z"
      }
   }
]

活动类型中商品的映射:

"offers": {
   "type": "nested",
   "include_in_parent": true,
   "properties": {
      "id": {
         "type": "long"
      },
      "title": {
         "type": "string",
         "index": "not_analyzed"
      }
   }
},

1 个答案:

答案 0 :(得分:1)

您需要inner_hits个功能和nested个查询:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "nested": {
                "path": "offers",
                "query": {
                  "term": {
                    "offers.id": "12"
                  }
                },
                "inner_hits":{}
              }
            }
          ]
        }
      }
    }
  }
}

这将在名为inner_hits的响应中添加另一个部分,其中显示匹配的嵌套文档。

如果您不需要原始offers值,则可以在原始查询中添加以下内容:

{
  "_source": {"exclude": "offers"}, 
  "query": {
    "filtered": {