2015-02-09 2 views
6

Próbuję napisać kwerendę za pomocą query_string do pobierania kwerend danych przez zagnieżdżonych obiektów.Elasticsearch query_string zagnieżdżone zapytanie

Przykład zapytania ja jak zrobić, to ten:

{ 
    "query": { 
    "query_string": { 
     "query": "a.id:2" 
    } 
    } 
} 

gdzie "a" jest zagnieżdżony obiektu, a "ID" jest polem "A".

wiem, że mogę z powodzeniem wykonać to zadanie za pomocą za pomocą zagnieżdżonych kwerendy, pisząc zapytanie jak:

{ 
    "nested": { 
    "path": "a" 
    "query_string": { 
     "query": "a.id:2" 
    } 
    } 
} 

Jednak chciałbym, aby tego uniknąć. Nie chcę samodzielnie odkryć, że użytkownik szuka zagnieżdżonego pola i modyfikuje zapytanie. Próbowałem użyć parametru "fields", ale wygląda na to, że nie działa z obiektami zagnieżdżonymi.

Czy można napisać to zapytanie bezpośrednio za pomocą zapytań "query_string"? Jakiego semantycznego można uzyskać? (na przykład, jeśli napiszę "a.id:2 AND ab: 10" pasuję do dwóch pól w tym samym obiekcie lub w różnych obiektach?)

+0

Próbuję znaleźć odpowiedź na to samo pytanie. Zastanawiam się, czy udało ci się znaleźć jakieś rozwiązanie. Każda pomoc będzie świetna! Dzięki – Vineet

+0

Niestety nie znalazłem rozwiązania. – Cale

Odpowiedz

7

Zrobiłem więcej badań i okazało się, że można to osiągnąć przez ustawienie ustawienia include_in_parent na true w odwzorowaniu.

Teraz powinieneś być w stanie wykonać kwerendy jak

{ 
    "query": { 
    "query_string": { 
     "query": "fields.fieldvalue:sometext" 
    } 
    } 
} 

Eg: -

"mappings": { 
     "documentmetadatavalue": { 
      "properties": { 
       "id": { 
        "type": "string" 
       }, 
       "fields": { 
       "type": "nested", 
       "include_in_parent": true, 
       "properties": { 
        "fieldId": {"type": "string"}, 
        "fieldvalue": {"type": "string"} 
       } 
       } 
      } 
     } 
    } 

Daj mi znać, jeśli to pomaga.

+4

To, co proponujesz, jest dobrą alternatywą. Zauważ jednak, że przy ustawieniu "include_in_parent" spłaszczasz zasób zagnieżdżony jako obiekt w obiekcie nadrzędnym. W rzeczywistości reindeksujesz dokument jako spłaszczony obiekt. Tracisz jakąś fajną cechę zagnieżdżonych obiektów. Na przykład, jeśli szukasz obiektów nadrzędnych posiadających co najmniej JEDNO element potomny z DWIEma atrybutami o określonej wartości, zapytanie nie sprawdzi, czy atrybuty DW mają te wartości w unikalnym potomku. – Cale

+0

Zapoznaj się z dokumentacją inner_hits, która została niedawno wydana. Powinieneś być w stanie sprawić, by działało z tą nową funkcją. (https://www.elastic.co/guide/en/elasticsearch/reference/1.x/search-request-inner-hits.html#nested-inner-hits – Vineet