仅从查询结果中过滤匹配的数据

时间:2019-07-24 06:07:57

标签: elasticsearch

我有一个包含用户数组的文档。在用户数组内部,我有汽车数组。 我只想过滤出与查询匹配的文档部分。

我尝试添加过滤器,但似乎未返回正确的结果。

这是我的文档,其中包含两个用户。 每个用户都会有几辆车。

{
  "group": "fans",
  "user": [
    {
      "first": "John",
      "last": "Paul",
      "cars": [
        {
          "model": "deyatona",
          "make": "ferrari"
        },
        {
          "model": "gallardo",
          "make": "lamborghini"
        }
      ]
    },
    {
      "first": "Papa",
      "last": "Jones",
      "cars": [
        {
          "model": "Q7",
          "make": "audi"
        },
        {
          "model": "250 gt",
          "make": "ferrari"
        }
      ]
    }
  ]
}
---
Here is my search query:
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "user.first": "John"
              }
            },
            {
              "nested": {
                "path": "user.cars",
                "query": {
                  "match": {
                    "user.cars.make": "ferrari"
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}


===>
This obviously returns the whole document.

I want to filter out only the following part which matches the query:
{
      "first": "John",
      "last": "Paul",
      "cars": [
        {
          "model": "deyatona",
          "make": "ferrari"
        }
      ]
}

1 个答案:

答案 0 :(得分:0)

使用inner_hits

{
  "query": {
    "nested": {
      "inner_hits": {
        "name": "outer",
        "_source": ["user.first", "user.last"]
      }, 
      "path": "user",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "user.first": "John"
              }
            },
            {
              "nested": {
                "inner_hits": {}, 
                "path": "user.cars",
                "query": {
                  "match": {
                    "user.cars.make": "ferrari"
                  }
                }
              }
            }
          ]
        }
      }
    }
  },
  "_source": false
}