Elasticsearch 中父子关系的查询问题



具有以下孩子-父亲映射:

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"  },
}}}}'

。这两位有ID的父母1011

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",
}'

。而这两个孩子:

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",
}'
通过

以下查询,我想通过user_id = 1234获得父亲的_id.

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"
}}}}}'

这将输出两个ids1011

现在我想只在这些特定ids上搜索父级,如下所示:

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

如您所见,"_id": ["10", "11"]部分是手写的。我想知道是否有办法将这两个查询合并到一个查询中,将第一个查询中返回的ids自动放在第二个查询上。

所以输出应该是:

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

使用 bool Query 并将两个条件放在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"
                 }
              }
           }
        }
     ]
     }
  }
}'

最新更新