2016-03-18 30 views
5

Czy można uzyskać dane terenowe od rodziców i dzieci w jednym zapytaniu elasticsearch? Zasadniczo to, co próbuję przechwycić dane dla wielu pól nadrzędnych i wielu pól podrzędnych w jednej iteracji z filtrowaniem. Próbowałem różnych metod wiązania informacji w pojedynczym zapytaniu, ale nie byłem w stanie znaleźć drogi od niego. Oto jak mój mapowanie wygląda następująco: -Uzyskaj wiele danych w terenie od rodziców i dzieci w jednym zapytaniu elasticsearch

parent:

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

dziecko:

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

oczekiwany wynik (coś podobnego do poniżej):

(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."} 
      } ] 
      } 

Linki:

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

Czy ta praca była dla Ciebie? – Righto

Odpowiedz

2

Zrobiłem pewne założenia ... niech mnie wiedzieć, czy są one poprawne

  1. chcesz dokumentu z mapowania macierzystego, który ma identyfikator dokumentu = 1
  2. Warto również wszystkie dokumenty podrzędne, które parent_id = 1
  3. Przekazujesz ten identyfikator nadrzędny ze swojego kodu do elastycznego wyszukiwania.
  4. Nie prosisz elasticsearch, aby filtrował wiele dokumentów nadrzędnych. Zanim trafisz elasticsearch, wiesz już chcesz dokumentu nadrzędnego z id = 1

Jeśli jest to przypadek, można utworzyć dwa oddzielne zapytania

pierwsze zapytanie będzie „dostać nadrzędny dokument z id = 1"
drugie zapytanie będzie «uzyskać wszystkie dokumenty podrzędne z parent_id = 1»

I można korzystać z Elasticsearch za «Multisearch API», aby wysłać oba te żądania do elasticsearch w jednej rozmowy sieciowej

MultiSearch API

6

To brzmi jak zadanie dla inner hits. Ta funkcja umożliwia uzyskanie trafień, które spowodowały dopasowanie do has_child lub has_parent.

W twoim przypadku chcesz złożyć zapytanie wobec rodzica, z błahego has_child (tj match_all) lub odwrotnie, na przykład coś takiego

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

Jak dodać filtr do atrybutów nadrzędnych w tym samym zapytaniu? – Righto

+0

Czy możesz filtrować rekordy nadrzędne na konkretnych polach przed odfiltrowaniem ich dzieci? – Righto

+0

To powinno być po prostu "normalnym" filtrem/zapytaniem, tj. Utworzyć zapytanie boolowe zawierające zarówno has_child, jak i (na przykład) wyrażenie query/filter na rodzicu –