Avión
Avión

Reputation: 8395

Query issue with parent-children relation in Elasticsearch

Having the following children-father mapping:

curl -XPUT 'localhost:9200/my_index' -d '{
  "mappings": {
    "my_parent": {
       "dynamic": "strict",
       "properties" : {
            "title" : { "type": "string"  },
            "body" : { "type": "string"  },
            "source_id" : { "type": "integer"  },
        }
    },
    "my_child": {
      "_parent": {"type": "my_parent" },
      "properties" : {
            "user_id" : { "type": "string"  },
}}}}'

... this two parents with ids 10 and 11:

curl -X PUT 'localhost:9200/my_index/my_parent/10' -d '{
  "title" : "Microsiervos - Discos duros de 10TB",
  "body" : "Empiezan a sacar DD de 30GB en el mercado",
  "source_id" : "27",
}'

curl -X PUT 'localhost:9200/my_index/my_parent/11' -d '{
  "title" : "Microsiervos - En el 69 llegamos a la luna",
  "body" : "Se cumplen 3123 anos de la llegada a la luna",
  "source_id" : "27",
}'

... and this two childrens:

curl -XPUT 'localhost:9200/my_index/my_child/1234_10?parent=10' -d '{
  "user_id": "1234",
}'

curl -XPUT 'localhost:9200/my_index/my_child/1234_11?parent=11' -d '{
  "user_id": "1234",
}'

With the following query, I want to get the _id of the father with user_id = 1234.

curl -XGET 'localhost:9200/my_index/my_parent/_search?pretty=true' -d '{
  "_source" : "_id",
  "query": {
    "has_child": { 
      "type": "my_child",
      "query" : {
           "query_string" : {
               "default_field" : "user_id",
               "query" : "1234"
}}}}}'

This outputs the two ids, 10 and 11.

Now I want to search on parent on those specific ids only, something like this:

curl -XGET 'localhost:9200/my_index/my_parent/_search?pretty=true' -d '{
"query": {
    "bool": {
      "must": [
        {
          "terms": {
            "_id": ["10", "11"]
         }},
        {
          "query_string": {
            "default_field": "body",
            "query": "mercado"
}}]}}}'

As you can notice, the "_id": ["10", "11"] part is written by hand. I would like to know if there's a way to combine this two queries in one single query putting the ids returned in the first query automatically on the second query.

So the output to this should be:

  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.69177496,
    "hits" : [ {
      "_index" : "my_index",
      "_type" : "my_parent",
      "_id" : "10",
      "_score" : 0.69177496,
      "_source":{
  "title" : "Microsiervos - Discos duros de 10TB",
  "body" : "Empiezan a sacar DD de 30GB en el mercado",
  "source_id" : "27"
}}]}}

Upvotes: 0

Views: 32

Answers (1)

Richa
Richa

Reputation: 7649

Use bool Query and put both conditions in must:

curl -XGET "http://localhost:9200/my_index/my_parent/_search" -d'
{
"query": {
  "bool": {
     "must": [
        {
           "query_string": {
              "default_field": "body",
              "query": "mercado"
           }
        },
        {
           "has_child": {
              "type": "my_child",
              "query": {
                 "query_string": {
                    "default_field": "user_id",
                    "query": "1234"
                 }
              }
           }
        }
     ]
     }
  }
}'

Upvotes: 1

Related Questions