В некоторых случаях требуется узнать, какому подзапросу удовлетворил документ, чаще всего это происходит при необходимости объединить запросы разного характера в одном ИЛИ, и приложению требуются дополнительные данные, чтобы по-разному отобразить те или иные совпадения. Например, данный запрос ищет фильмы, в которых или участвовал Райан Рейнолдьс, или которые относятся к жанру комедии:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "stars": {
              "query": "Ryan Reynolds"
            }
          }
        },
        {
          "term": {
            "genre": {
              "value": "comedy"
            }
          }
        }
      ]
    }
  }
}

Подобную макрировку можно осуществить с помощью named queries (появился новый атрибут _name):

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "stars": {
              "query": "Ryan Reynolds",
              "_name": "stars"
            }
          }
        },
        {
          "term": {
            "genre": {
              "value": "comedy",
              "_name": "genre"
            }
          }
        }
      ]
    }
  }
}

В результате документы будут возвращены с названиями подзапросов, которым они удовлетворяют:

[
    {
        "_index": "movies",
        "_type": "_doc",
        "_id": "mRDzcmsBidhkTp3CVss9",
        "_score": 0.753101,
        "_source": {
            "title": "Pokemon Detective Pikachu",
            "genre": [
                "comedy",
                "adventure"
            ],
            "stars": [
                "Ryan Reynolds"
            ],
            "released": "2019-05-10"
        },
        "matched_queries": [
            "genre",
            "stars"
        ]
    },
    {
        "_index": "movies",
        "_type": "_doc",
        "_id": "mBDtcmsBidhkTp3C6Mv6",
        "_score": 0.38845783,
        "_source": {
            "title": "Detention",
            "genre": "comedy",
            "released": "2012-04-13"
        },
        "matched_queries": [
            "genre"
        ]
    },
    {
        "_index": "movies",
        "_type": "_doc",
        "_id": "mhACc2sBidhkTp3CZctM",
        "_score": 0.36464313,
        "_source": {
            "title": "Life",
            "genre": "thriller",
            "stars": [
                "Ryan Reynolds"
            ],
            "released": "2017-03-24"
        },
        "matched_queries": [
            "stars"
        ]
    }
]

Как можно видеть, вместе с документами возвращается поле matched_queries, которое информирует о том, какие подзапросы совпали.

Тестовые данные

Индекс

{
  "settings": {
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "title": {
      	"type": "text",
        "index": false
      },
      "genre": {
        "type": "keyword"
      },
      "released": {
        "type": "date"
      }
    }
  }
}

Документы

{
  "title": "Pokemon Detective Pikachu",
  "genre": ["comedy", "adventure"],
  "stars": ["Ryan Reynolds"],
  "released": "2019-05-10"
}
{
  "title": "Detention",
  "genre": "comedy",
  "stars": [],
  "released": "2012-04-13"
}
{
  "title": "Life",
  "genre": "thriller",
  "stars": ["Ryan Reynolds"],
  "released": "2017-03-24"
}