2012-05-27 2 views
6

Dato JSON nell'indice ES nel seguente formato:elasticsearch QueryBuilder corrispondenti a più Condizioni

{ 
    "pin": { 
     "id": 123, 
     "location": { 
      "lat": 456, 
      "lon":-789 
     } 
    } 
} 

Il seguente ottiene il documento che corrisponde al campo id:

client.prepareSearch("index_name") 
     .setTypes("pin") 
     .setQuery(QueryBuilders.termQuery("id", 123)) 
     .execute() 
     .actionGet(); 

Invece, ho 'm cercando di abbinare più campi, es. (location.lat, location.lon).

QueryBuilders.termQuery(); // accepts only a single term 

provato alcune alternative, ma nessuna di esse sembra funzionare, ad esempio:

QueryBuilder queryBuilder = QueryBuilders.boolQuery() 
     .must(QueryBuilders.termQuery("location.lat", 456)) 
     .must(QueryBuilders.termQuery("location.lon", -789)); 

client.prepareSearch("index_name") 
     .setTypes("pin") 
     .setQuery(queryBuilder) 
     .execute() 
     .actionGet(); 
+0

è la posizione indicizzati come geo_point? – imotov

+0

Sì, è mappato come 'geo_point'. – ahmedyha

risposta

4

Per impostazione predefinita, un campo geo_point non è indicizzato come due campi (location.lat e location.lon), è indicizzato come un singolo campo che contiene sia latitudine sia longitudine.

È possibile attivare l'indicizzazione di latitudine e longitudine attivando lat_lonmapping option. Tuttavia, nel tuo esempio, i valori di latitudine e longitudine sono troppo grandi. Quindi, sono normalizzati, convertiti in double e indicizzati come -84.0 e -69.0 invece di 456 e -789. Quindi, se abiliti lo lat_lon e sostituisci il valore nelle query, dovresti essere in grado di ottenere i risultati.

Si prega di notare che i valori per latitudine e longitudine vengono convertiti in double prima dell'indicizzazione. Pertanto, l'utilizzo di query a termine potrebbe non essere molto pratico a lungo termine, poiché è necessario tenere sempre in considerazione gli errori di arrotondamento. Potrebbe essere più utile usare invece range queries o elasticsearch geospatial queries.

1

Scopri i bool query in elasticsearch, si dovrebbe essere in grado di specificare must, should o should_not per ottenere la miscela appropriata di e/o per la tua richiesta.

+1

Penso che questo sia quello che ho provato, lo snippet di codice sopra. – ahmedyha

0

È possibile utilizzare QueryBuilders.multiMatchQuery invece di QueryBuilders.termQuery