2012-05-27 20 views
6

Dada JSON en el índice de ES en el siguiente formato:Elasticsearch QueryBuilder coincidencia múltiple Términos

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

El siguiente obtiene el documento correspondiente al campo id:

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

En cambio, yo estoy tratando de igualar campos múltiples, es decir. (location.lat, location.lon).

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

Probamos algunas alternativas, pero ninguna de ellas parece que funciona, por ejemplo:

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

es la ubicación indexado como geo_point? – imotov

+0

Sí, está mapeado como 'geo_point'. – ahmedyha

Respuesta

4

De forma predeterminada, un campo de geo_point no está indexado como dos campos (location.lat y location.lon), se indexa como un solo campo que contiene tanto la latitud como la longitud.

Puede activar la indexación de latitud y longitud activando lat_lonmapping option. Sin embargo, en su ejemplo, los valores de latitud y longitud son demasiado grandes. Por lo tanto, están normalizados, convertidos al doble e indexados como -84.0 y -69.0 en lugar de 456 y -789. Por lo tanto, si habilita lat_lon y reemplaza el valor en las consultas, debería poder obtener los resultados.

Tenga en cuenta que los valores de latitud y longitud se convierten a doble antes de la indexación. Por lo tanto, el uso de consultas de términos puede no ser muy práctico a largo plazo, ya que siempre tendrá que tener en cuenta los errores de redondeo. Puede ser más útil usar range queries o elasticsearch geospatial queries en su lugar.

1

Mira la bool query en Elasticsearch, usted debe ser capaz de especificar must, should o should_not para conseguir la mezcla apropiada de y/o para su consulta.

+1

Creo que esto es lo que probé, el fragmento de código anterior. – ahmedyha

0

Se puede utilizar en lugar de QueryBuilders.multiMatchQuery QueryBuilders.termQuery

Cuestiones relacionadas