2012-02-15 9 views

Respuesta

38

Sí, puede, utilizando un script field.

Por ejemplo, suponiendo que el documento tiene un campo geo-punto llamado location, podría utilizar el siguiente:

(tenga en cuenta la \u0027 es sólo una comilla simple escapado, por lo \u0027location\u0027 es realmente 'location')

curl -XGET 'http://127.0.0.1:9200/geonames/_search?pretty=1' -d ' 
{ 
    "script_fields" : { 
     "distance" : { 
     "params" : { 
      "lat" : 2.27, 
      "lon" : 50.3 
     }, 
     "script" : "doc[\u0027location\u0027].distanceInKm(lat,lon)" 
     } 
    } 
} 
' 

# [Thu Feb 16 11:20:29 2012] Response: 
# { 
# "hits" : { 
#  "hits" : [ 
#   { 
#    "_score" : 1, 
#    "fields" : { 
#    "distance" : 466.844095463887 
#    }, 
#    "_index" : "geonames_1318324623", 
#    "_id" : "6436641_en", 
#    "_type" : "place" 
#   }, 
... etc 

Si desea que el campo _source a ser devuelto a su vez, a continuación, se puede especificar que la siguiente manera:

curl -XGET 'http://127.0.0.1:9200/geonames/_search?pretty=1' -d ' 
{ 
    "fields" : [ "_source" ], 
    "script_fields" : { 
     "distance" : { 
     "params" : { 
      "lat" : 2.27, 
      "lon" : 50.3 
     }, 
     "script" : "doc[\u0027location\u0027].distanceInKm(lat,lon)" 
     } 
    } 
} 
' 
+0

¡Perfecto! Gracias. – Yeggeps

+0

Sin embargo, estoy teniendo problemas para obtener tanto _source como la distancia devuelta. Si especifico _source como "campos" solo obtengo _source, si no lo hago solo, obtengo distancia. ¿Alguna idea? – Yeggeps

+0

¿Qué versión de ES estás usando? Cuando escribí esta respuesta, apareció un error recientemente introducido que significaba que la fuente no se devolvía. Sin embargo, eso se ha corregido en el último RC – DrTech

3

Desde ES 1.3 MVEL está desactivado por defecto a fin de utilizar una consulta como:

GET some-index/_search 
{ 
    "sort": [ 
    { 
     "_geo_distance": { 
     "geo_location": "47.1, 8.1", 
     "order": "asc", 
     "unit": "m" 
     } 
    } 
    ], 
    "query": { 
    "match_all": {} 
    }, 
    "script_fields" : { 
     "distance" : { 
     "lang": "groovy", 
     "params" : { 
      "lat" : 47.1, 
      "lon" : 8.1 
     }, 
     "script" : "doc[\u0027geo_location\u0027].distanceInKm(lat,lon)" 
     } 
    } 
} 

véase: "lang": "groovy", parte

+0

¿podría decirme cómo activó el scripting? Quiero decir, ¿escribió algo dentro de su archivo yml o algo por favor dime que estoy buscando esto por mucho tiempo? –

6

Para volver aswel distancia que como todos los campos predeterminados/fuente, que también podría haz esto:

Para evitar que ordene por distancia (principalmente) simplemente ordena por _score (o lo que sea que quieras, los resultados ordenados por) primero.

{ 
    "sort": [ 
    "_score", 
    { 
     "_geo_distance": { 
     "location": { 
      "lat": 40.715, 
      "lon": -73.998 
     }, 
     "order":   "asc", 
     "unit":   "km", 
     "distance_type": "plane" 
     } 
    } 
    ] 
} 
+0

no funciona ¿le funciona? –

+1

Esta solución funciona también con el soporte de scripts desactivado, como es el caso en muchos servidores alojados. ¡Gracias! – mporkola

3

Gran respuesta de DrTech ... aquí está una versión actualizada de Elasticsearch 5.x con sin dolor como el lenguaje de comandos. También agregué "store_fields" para incluir _source en el resultado:

curl -XGET 'http://127.0.0.1:9200/geonames/_search?pretty=1' -d ' 
{ 
    "stored_fields" : [ "_source" ], 
    "script_fields" : { 
    "distance" : { 
     "script" : { 
     "inline": "doc['location'].arcDistance(params.lat,params.lon) * 0.001", 
     "lang": "painless", 
     "params": { 
      "lat": 2.27, 
      "lon": 50.3 
     } 
     } 
    } 
    } 
}' 
+0

Cualquier razón por la cual esto me daría una 'Variable [lugar] no está definida' para 'doc ['venue.coordinates']'? Lugar de encuentro.coordenadas es un campo en lugar de objeto, por lo que no estoy seguro de lo que falta. –

Cuestiones relacionadas