44 votes

Distance de retour dans les résultats de recherche d'élasticité ?

Ma question est similaire à celle- ci .

Simplement, existe-t-il un moyen de renvoyer la distance géographique lorsque vous ne triez PAS avec _geo_distance ?

Mettre à jour: Pour clarifier, je veux les résultats dans un ordre aléatoire ET inclure la distance.

20voto

Jette Points 723

Excellente réponse de DrTech ... voici une version mise à jour pour Elasticsearch 5.x avec indolore comme langage de script. J'ai également ajouté "store_fields" pour inclure _source dans le résultat :

 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
        }
      }
    }
  }
}'

14voto

Ludo DD Points 121

Pour renvoyer la distance ainsi que tous les champs/source par défaut, vous pouvez également faire ceci :

Pour éviter qu'il ne trie par distance (principalement), vous triez simplement par _score (ou tout ce que vous voulez que les résultats soient triés) d'abord.

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

4voto

user1266222 Points 43

Étant donné que ES 1.3 MVEL est désactivé par défaut, utilisez une requête telle que :

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

voir : "lang": "groovy", partie

0voto

Luke Points 6072

J'utilise quelque chose comme ça :

 "query": {
   "match_all": {}
},
"sort" : [
     {
         "_geo_distance" : {
             "location" : [150.8327178955, -34.7362136841],
             "order" : "asc",
             "unit" : "km"
         }
     }
 ]

Cela me permet de trier par distance et cela ajoutera un sort aux résultats.

Avis de non-responsabilité : je suis assez nouveau sur Elasticsearch, donc cela peut être faux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X