2016-03-18 45 views
5

È possibile ottenere dati di campo da genitore e figlio in una singola query elasticsearch? Essenzialmente quello che sto cercando di acquisire i dati per più campi padre e più campi figlio in una singola iterazione con filtro. Ho provato vari metodi per legare le informazioni in una singola query, ma non sono riuscito a capirne il senso. Ecco come il mio mappatura appare come: -Ottenere dati di campo multipli da genitore e figlio in una singola query elasticsearch

genitore:

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

bambino:

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

Output previsto (qualcosa di simile a sotto):

(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:

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", 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    }" 
+0

Questo lavoro ha funzionato? – Righto

risposta

2

Ho fatto alcune ipotesi ... lasciami sapere se sono corrette

  1. è necessario un documento dalla mappatura genitore che ha un id documento = 1
  2. volete anche tutti i documenti figli che hanno parent_id = 1
  3. Si sta passando questo parent_id dal codice a elasticsearch.
  4. Non si sta chiedendo a elasticsearch di filtrare attraverso più documenti padre. Prima di lanciare elasticsearch, sai già che si desidera documento genitore con id = 1

Se questo è il caso, è possibile creare due query separate

prima domanda sarebbe "ottenere doc genitore con id = 1"
seconda query sarebbe 'ottenere tutti i documenti bambino con parent_id = 1'

ed è possibile utilizzare l'elasticsearch 'API Multisearch' per inviare entrambe le richieste di elasticsearch in una chiamata di rete

MultiSearch API

6

Questo suona come un lavoro per inner hits. Questa funzione ti consente di ottenere i risultati che hanno determinato una corrispondenza has_child o has_parent.

Nel tuo caso che saresti una query contro il genitore, con un banale has_child (cioè match_all) o viceversa, per esempio qualcosa come

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

Come si aggiungerebbe un filtro sugli attributi padre nella stessa query? – Righto

+0

È possibile filtrare i record padre su campi specifici prima di filtrare i propri figli? – Righto

+0

Questo dovrebbe essere solo un filtro/query "normale", ovvero creare una query bool che contiene sia has_child sia (ad esempio) una query query/filtro sul genitore –