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

Viewed 2742

Is it possible to get field data from both parent and child in a single elasticsearch query? Essentially what I am trying to capture the data for the multiple parent fields and multiple child fields in a single iteration with filtering. I tried various methods of binding the information into a single query but not able to figure out a way from it. Here is how my mapping looks like :-

parent:

_id_parent : values {1}
_source: {_date (20160316), _time (20160316010000), _id_source (test), _year (2016), _month (1)}

child:

_id_child : values {1}
_source: {_id_child (1), _id_parent (1), _child_question (q1), _child_answer (This needs to be done.)}

Expected Output (something similar to below):

    (PARENT)
      "hits" : {
        "total" : 1,
        "max_score" : 1.0,
        "hits" : [ {
          "_index" : "index",
          "_type" : "parent",
          "_id" : "1",
          "_score" : 1.0,
          "_source":{_id_parent":"1","_id_source":"test","_date":"20160316","_time":"20160316010000","_year":2016,"_month":"1"}
        } ]
      }
        (CHILD)
          "hits" : {
            "total" : 1,
            "max_score" : 1.0,
            "hits" : [ {
              "_index" : "index",
              "_type" : "child",
              "_id" : "1",
              "_score" : 1.0,
              "_source":{"_id_child":"1", "_child_question":"q1","_child_answer":"This needs to be done."}
            } ]
          }

Links:

http://rore.im/posts/elasticsearch-joins/

https://github.com/elastic/elasticsearch/issues/761

https://www.elastic.co/guide/en/elasticsearch/guide/current/children-agg.html

    curl -XGET "$ELASTICSEARCH_ENDPOINT/index/parent/_search?pretty=true" -d "
    {
        "query": {
            "match": {
                "_id_parent": "1"
                }
            },
            "size" : 10,
            "aggs": {
                "_id_parent": {
                    "terms": {
                        "field":"_id_parent",
                        "field":"_id_source",
                        "field":"_date",
                        "field":"_time",
                        "field":"_year",
                        "field":"_month",
                        },
                    "aggs": {
                        "child": {
                            "children": {
                                "type": "child"
                                },
                            "aggs": {
                                "child": {
                                    "terms": {
                                        "field": "child._id_child",
                                        "field": "child._child_question",
                                        "field": "child._child_answer",
                                }
                            }
                        }
                    }
                }
            }
        }
    }"
3 Answers

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"
                  }
               }
            }
          }
        }
      ]
      }
    }
   }
Related