2011-09-15 9 views
8

Rozważ bardzo prosty model, w którym mamy lokalizacje, a każda lokalizacja może mieć zero lub więcej zdarzeń. Lokalizacja ma właściwości takie jak nazwa, opis i dane punktu geograficznego (lon/lat). Zdarzenie powinno być dołączone do jednej lokalizacji (jej rodzica) i powinno mieć nazwę i opis.Jak mogę pobrać tylko pasujące dzieci?

{ 
    "location" : { 
     "properties": { 
      "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
      "description": { "type": "string", "analyzer": "snowball" }, 
      "geo": { "type": "geo_point" }, 
      "exhibits": { 
       "type": "nested", 
       "properties": { 
        "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
        "description": { "type": "string", "analyzer": "snowball" } 
       } 
      } 
     } 
    } 
} 

Co chcę móc to zrobić, jest wysłanie zapytania do dokumentów podrzędnych (zdarzenia) przeprowadzenia wyszukiwanie pełnotekstowe na ich nazwami i opisami. Chciałbym odzyskać pasujące zdarzenia i móc również uzyskać nazwę nadrzędnej lokalizacji. Chciałbym również zawęzić wyniki ustawione przez współrzędne lokalizacji. Nie chcę otrzymywać żadnych zdarzeń, które nie pasują do zapytania. Czy to możliwe w Elastic Search? Jakich typów zapytań powinienem używać?

Próbowałem wstawiania zdarzeń jako właściwości tablicy pod lokalizację (patrz wyżej) i przy użyciu kwerendy nested, ale nie zwraca rodzaju wyników, które chcę (myślę, że zwraca całą lokalizację, w tym wszystkie zdarzenia, nawet te, które nie pasują do mojego zapytania). Próbowałem umieszczać zdarzenia w osobnym indeksie (mapowanie?) Dostarczając właściwość _parent, a następnie wykonując kwerendę top_children w lokalizacjach, ale nie otrzymałem żadnych wyników.

{ 
    "exhibit": { 
     "_parent": { "type": "locations" }, 
     "properties": { 
      "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
      "description": { "type": "string", "analyzer": "snowball" } 
     } 
    } 
} 

Czy ktoś może rzucić trochę światła? Nie wiem od czego zacząć ...

Odpowiedz

8

Oto działające rozwiązanie mojego problemu, być może przyda się komuś.

Lokalizacja mapowanie:

{ 
    "location" : { 
     "properties": { 
      "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
      "description": { "type": "string", "analyzer": "snowball" }, 
      "geo": { "type": "geo_point" } 
     } 
    } 
} 

mapowanie wystawy:

{ 
    "exhibit": { 
     "_parent": { "type": "locations" }, 
     "properties": { 
      "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
      "description": { "type": "string", "analyzer": "snowball" } 
     } 
    } 
} 

Zapytanie:

{ 
    "fields": [ "_parent", "name", "_source" ], 
    "query": { 
     "bool": { 
      "should": [ 
       { "text": { "name": "candy" } }, 
       { "text": { "description": "candy" } } 
      ] 
     } 
    }, 
    "filter": { 
     "and": [ 
      { 
       "terms" : { 
        "_parent": [ "4e7089a9b97d640b30695b7a", "4e7089eeb97d640b30695b7b" ] 
       } 
      }, 
      { "range": { "start": { "lte": "2011-09-22" } } }, 
      { "range": { "end": { "gte": "2011-09-22" } } } 
     ] 
    } 
} 

Należy kwerendy przy użyciu pola _parent i przekazując jej tablicę identyfikatorów o lokalizacjach które chcesz ograniczyć eksponaty.

+0

Bardzo pomocna, dziękuję za udostępnienie. Jakiego JSON używasz do dodania nowej wystawy do lokalizacji? – gjb

+0

Fajnie, ale jak odzyskać nazwisko rodziców? '" fields ": [" _parent "," name "," _source "]' Czy pobierze nazwę dziecka, prawda? – Yeggeps

+0

@ Eggeps: Tak, zapytanie szuka dzieci jakiegoś dokumentu. To, o co prosisz, nie należy do mojego scenariusza. –

Powiązane problemy