2011-09-15 2 views
8

Si consideri un modello molto semplice in cui sono presenti posizioni e ogni posizione può avere zero o più eventi. Una posizione avrebbe proprietà come nome, descrizione e dati geografici (lon/lat). Un evento dovrebbe essere associato a un luogo (il suo genitore) e dovrebbe avere un nome e una descrizione.Come posso recuperare solo i bambini corrispondenti?

{ 
    "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" } 
       } 
      } 
     } 
    } 
} 

Quello che voglio essere in grado di fare, è quello di interrogare i documenti figli (eventi) che effettuano una ricerca full text sui loro nomi e descrizioni. Vorrei recuperare gli eventi corrispondenti e poter anche ottenere il nome della posizione principale. Mi piacerebbe anche restringere il risultato impostato dalle coordinate della posizione. Non voglio ricevere eventi che non corrispondono alla query. È possibile nella ricerca elastica? Quali tipi di query dovrei usare?

Ho provato a mettere eventi come una proprietà di matrice in posizione (vedi sopra) e utilizzando la query nested ma non restituisce il tipo di risultati che voglio (penso che restituisca l'intera posizione, compresi tutti gli eventi, anche il quelli che non corrispondono alla mia richiesta). Ho provato a inserire eventi in un indice separato (mappatura?) Fornendo la proprietà _parent e quindi eseguendo la query top_children nelle posizioni, ma non ottengo alcun risultato.

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

Qualcuno potrebbe far luce? Non so da dove cominciare ...

risposta

8

Ecco la soluzione di lavoro al mio problema, forse sarà utile a qualcuno.

Località mappatura:

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

mappatura Exhibit:

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

Query:

{ 
    "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" } } } 
     ] 
    } 
} 

Si dovrebbe interrogare utilizzando il campo _parent e passando una matrice di ID di luoghi per che vuoi limitare le esposizioni.

+0

Molto utile, grazie per aver condiviso. Quale JSON stai usando per aggiungere una nuova mostra in una posizione? – gjb

+0

Cool, ma come si recupera il nome dei genitori? '" campi ": [" _parent "," name "," _source "]' Recupererà il nome childs, giusto? – Yeggeps

+0

@Yeggeps: Sì, la query sta cercando i figli di alcuni documenti. Quello che chiedi non appartiene al mio scenario. –