2016-03-18 11 views
5

Ist es möglich, Felddaten von Eltern und Kind in einer einzigen ElasticSearch-Abfrage zu erhalten? Im Wesentlichen versuche ich, die Daten für die mehreren übergeordneten Felder und mehrere untergeordnete Felder in einer einzigen Iteration mit Filterung zu erfassen. Ich habe verschiedene Methoden ausprobiert, um die Informationen in eine einzige Abfrage zu betten, aber nicht in der Lage, daraus einen Weg zu finden. Hier ist, wie mein Mapping wie folgt aussieht: -Erhalten Sie multiple Felddaten von Eltern und Kind in einer einzigen Elasticsearch Abfrage

parent:

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

Kind:

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

Erwartete Ausgabe (etwas ähnliches wie unten):

(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

Hat dies für Sie funktioniert? – Righto

Antwort

2

ich einige Annahmen gemacht haben ... lassen Sie mich wissen, ob sie

  1. Sie möchten ein Dokument aus dem übergeordneten Mapping korrekt sind, die ein Dokument-ID = 1 hat
  2. Sie wollen auch alle untergeordneten Dokumente, die pARENT_ID haben = 1
  3. Sie übergeben diese parent_id aus Ihrem Code an elasticsearch.
  4. Sie möchten nicht, dass elasticsearch nach mehreren übergeordneten Dokumenten sucht. Bevor Sie Elasticsearch treffen, wissen Sie bereits, wollen Sie übergeordnete Dokument mit id = 1

Wenn dies der Fall ist, können Sie zwei separate Abfragen erstellen

erste Abfrage würde Eltern doc mit id sein „get = 1"
zweite Abfrage wäre ‚alle untergeordneten Dokumente erhält mit parent_id = 1‘

und Sie können die Elasticsearch der Verwendung ‚Multisearch API‘ diese beiden Anforderungen senden in einem Netzwerk Aufruf Elasticsearch

MultiSearch API

6

Das für inner hits wie ein Job klingt. Diese Funktion ermöglicht es Ihnen, die Treffer zu erreichen, die einen has_child oder has_parent Treffer gemacht haben.

In Ihrem Fall, dass Sie eine Abfrage für die Eltern machen würden, mit einem trivialen has_child (dh match_all) oder umgekehrt, zum Beispiel so etwas wie

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

Wie würden Sie Filter für die übergeordneten Attribute in derselben Abfrage hinzufügen? – Righto

+0

Können Sie übergeordnete Datensätze in bestimmten Feldern filtern, bevor Sie ihre untergeordneten Elemente filtern? – Righto

+0

Das sollte nur eine "normale" Filter/Abfrage, dh erstellen Sie eine Bool-Abfrage, die sowohl die has_child und (zum Beispiel) eine Terms-Abfrage/Filter auf dem Eltern enthält –