通过geo_point确定匹配结果的优先级,并按Elasticsearch中最近的位置排序

时间:2016-10-25 08:49:31

标签: elasticsearch

我有GET请求,即匹配查询字符串。它在地址字符串中搜索,现在从索引返回实体和相关结果。

现在我希望按距离优先结果,首先,返回相关字符串,排序 最接近的geo_point参数

sort置于同一级别,在query参数之后实际上不会返回按距离排序的匹配。它返回奇怪的结果,绝对不是我想要的。

这是我使用的映射

{
   "location": {
      "properties": {
         "address": {
            "type": "string"
         },
         "gps": {
            "type": "geo_point"
         }
      }
   }
}

我现在正在做的请求是:

获取 / locations / location / _search

{        
   "query": {
       "match" : {
            "address" : {
                "query": "Churchill Av"                               
            }
        }      
   },
  "sort": [
    {
      "_geo_distance": {
        "gps": { 
          "lat": 51.358599, 
          "lon": 0.531964
        },
        "order":         "asc",
        "unit":          "km", 
        "distance_type": "plane" 
      }
    }
  ]   
}

我知道最好的方法是首先通过匹配获得结果,然后按距离对这些结果进行排序,因此地理距离计算不会太昂贵。

我尝试this question,但它没有帮助。

编辑:我需要提一下,我将geo_point数据存储在我的索引中,如下所示:

"_source": {
    "address" : "Abcdef, ghijk, lmnoprst"
    "gps": [
        51.50,
        1.25
    ]
} 

问题:如何设置地理距离排序/过滤器,因此结果按<=>匹配查询后排序,按最近的geo_point参数排序?

1 个答案:

答案 0 :(得分:1)

编辑:

我意识到, geo_point 数据存储为索引数组,这意味着值为[Lon, Lat],而不是[Lat, Lon]正如我所料,它无法在关联数组 _geo_distance模式中搜索:

{
    "lat" : Lat,
    "lon" : Long
}

来自elasticsearch.co文件:

  

请注意,字符串地理点按照lat,lon和array排序   geo-points的顺序为:lon,lat。

所以以这种方式正确的排序表示法是

"_geo_distance": {
    "gps": [51.358599,0.531964],                      
}

OR

"_geo_distance": {            
    "gps": {
        "lat": 0.531964,
        "lon": 51.358599  
     }  
}                    

...因为我将我的geo_point数据存储为[LON,LAT]而不是[LAT,LON],正如我所想的那样。

现在按预期工作了。我现在的问题是,我应该在geo_point数组中以相反的纬度/经度顺序重新索引数据。

我希望这句话可以帮助别人。