2012-02-15 14 views

risposta

38

Sì, è possibile, utilizzando un script field.

Per esempio, supponendo che il documento ha un campo geo-point chiamato location, è possibile utilizzare il seguente:

(da notare le \u0027 è solo un preventivo unico sfuggito, così \u0027location\u0027 è davvero '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 

Se si desidera che il campo _source da restituire così, allora è possibile specificare che la seguente:

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

Perfetto! Grazie. – Yeggeps

+0

Tuttavia, ho problemi a ottenere sia _source sia la distanza restituita. Se specifico _source come "campi" ottengo solo _source, se non lo faccio solo, ottengo la distanza. qualche idea? – Yeggeps

+0

Quale versione di ES stai usando? Quando ho scritto questa risposta, c'era un bug appena introdotto che significava che la fonte non veniva restituita. Tuttavia, questo è stato risolto nell'ultimo RC – DrTech

3

Dal ES 1.3 MVEL è disabilitato di default in modo da utilizzare una query come:

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

vedi: "lang": "groovy", parte

+0

puoi dirmi come hai abilitato lo script intendo che hai scritto qualcosa all'interno del tuo file yml o altro per favore dimmi che sto cercando questo per così tanto tempo ?? –

6

Per tornare distanza Viaggiavamo come come tutti i campi di default/fonte, si potrebbe anche A questo scopo:

Per evitare che esso si suddivida in base alla distanza (principalmente), si ordina per _score (o qualsiasi altra cosa si desidera che i risultati siano ordinati per primi).

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

non funziona è funzionante per te ?? –

+1

Questa soluzione funziona anche con il supporto per gli script disabilitato, come nel caso di molti server ospitati. Grazie! – mporkola

3

Grande risposta di DrTech ... ecco una versione aggiornata di Elasticsearch 5.x con indolore come linguaggio di script. Ho anche aggiunto "store_fields" per includere _source nel risultato:

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

Qualsiasi motivo per cui questo mi avrebbe dato un 'Variabile [luogo] non è definito. Per' doc ['venue.coordinates'] '? Venue. –

Problemi correlati