Get mutiple field data from both parent and child in a single elasticsearch query Get mutiple field data from both parent and child in a single elasticsearch query elasticsearch elasticsearch

Get mutiple field data from both parent and child in a single elasticsearch query


This sounds like a job for inner hits. This feature allows the you to get at the hits that made a has_child or has_parent match.

In your case you'd make a query against the parent, with a trivial has_child (ie match_all) or vice versa, for example something like

{    "query" : {        "has_child" : {            "type" : "child",            "query" : {                "match_all": {}            },            "inner_hits" : {}         }    }}


I have made some assumptions... let me know if they are correct

  1. You want a document from the parent mapping which has a document id = 1
  2. You also want all the child documents which have parent_id = 1
  3. You are passing this parent_id from your code to elasticsearch.
  4. You are not asking elasticsearch to filter through multiple parent documents. Before you hit elasticsearch, you already know you want parent document with id = 1

If this is the case, you can create two separate queries

First query would be "get parent doc with id = 1"
Second query would be "get all child docs with parent_id = 1"

And you can use the Elasticsearch's "multisearch API" to send both these requests to elasticsearch in one network call

MultiSearch API


You can use the below example to search from both parent and child index. Hopefully, this will help you.

    GET indexname/_search    {      "query": {      "bool": {      "must": [        {          "bool": {            "must": [              {                "term": {                  "parentField": {                    "value": "valuetosearch"                  }                }              }            ]          }        },        {          "has_child": {            "type": "childindex",            "query": {               "range" : {                  "childindexField" : {                      "lte": "value"                  }               }            }          }        }      ]      }    }   }