Elasticsearch 地理距离排序不完全/错误的顺序

Posted

技术标签:

【中文标题】Elasticsearch 地理距离排序不完全/错误的顺序【英文标题】:Elasticsearch geo distance sorting not exactly / wrong order 【发布时间】:2015-11-29 17:35:19 【问题描述】:

我正在使用 elasticsearch 为具有数千个位置的 Web 项目获得更快的地理距离搜索功能。结果应按距离排序。我的搜索查询有效,但结果的顺序不正确。结果应该是按距离升序排列,但首先是距离为“9 公里”,然后是“100 公里”,然后是“90 公里”。

我的搜索查询 JSON 如下(使用 php 创建):


    "index": "profiles",
    "type": "profile",
    "size": 30,
    "from": 0,
    "body": 
    "query": 
        "bool": 
            "filter": 
                "geo_distance": 
                    "distance": "100km",
                    "location": 
                        "lat": 49.449919468911,
                        "lon": 11.073560787681
                    
                
            
        
    ,
    "script_fields": 
        "distance": 
            "lang": "groovy",
            "params": 
                "lat": 49.449919468911,
                "lon": 11.073560787681
            ,
            "script": "doc['location'].distanceInKm(lat,lon)"
        
    ,
    "sort": [
        
            "upgrade_sort": 
                "order": "desc"
            
        ,
        
            "has_siegel": 
                "order": "desc"
            
        ,
        
            "_geo_distance": 
                "location": 
                    "lat": 49.449919468911,
                    "lon": 11.073560787681
                ,
                "order": "asc",
                "unit": "km"
            
        
    ]
    ,
    "fields": [
    "_source",
    "distance"
    ]

不幸的是,我找不到任何错误,所以我希望有人可以帮助我。谢谢!

【问题讨论】:

【参考方案1】:

您必须将_geo_distance 排序放在第一个位置而不是第三个位置。就目前而言,_geo_distance 排序只会对那些在upgrade_sorthas_siegel 具有相同值的文档按距离升序对文档进行排序。试试这个:


  "size": 30,
  "from": 0,
  "body": 
    "query": 
      "bool": 
        "filter": 
          "geo_distance": 
            "distance": "100km",
            "location": 
              "lat": 49.449919468911,
              "lon": 11.073560787681
            
          
        
      
    ,
    "script_fields": 
      "distance": 
        "lang": "groovy",
        "params": 
          "lat": 49.449919468911,
          "lon": 11.073560787681
        ,
        "script": "doc['location'].distanceInKm(lat,lon)"
      
    ,
    "sort": [
      
        "_geo_distance": 
          "location": 
            "lat": 49.449919468911,
            "lon": 11.073560787681
          ,
          "order": "asc",
          "unit": "km"
        
      ,
      
        "upgrade_sort": 
          "order": "desc"
        
      ,
      
        "has_siegel": 
          "order": "desc"
        
      
    ]
  ,
  "fields": [
    "_source",
    "distance"
  ]

【讨论】:

是的,没错,如果_geo_distance 是第一个排序标准,但它应该是第三个。但是距离排序不正确。例如,我的代码得到了这样的结果: upgrade_sort = 1 has_siegel = 0 distance = 4 km ; upgrade_sort = 1 has_siegel = 0 距离 = 120 公里; upgrade_sort = 1 has_siegel = 0 距离 = 90 公里;我想首先按 upgrade_sort 排序,第二个按 has_siegel 排序,第三个按距离排序。 您在 120 公里距离处获得一个文档很奇怪,因为您的查询指定最大距离应为 100 公里。您可以使用location 字段的映射更新您的问题吗? "120km" 是一个示例,用于演示结果顺序是如何错误的。搜索距离在 5 公里到 500 公里之间变化

以上是关于Elasticsearch 地理距离排序不完全/错误的顺序的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch:在 Elasticsearch 中按距离有效地对地理点进行排序

elasticsearch地理距离过滤器,但距离在文档上而不是在查询中

返回地理点数组的 Elasticsearch 距离

在地理定位排序中显示距离(以英里为单位)

如何进行地理距离查询仅返回我尚未“喜欢”的结果、Elastic Search、Dynamo DB

Elasticsearch-Query DSL