弹性搜索2.4 Geohash单元格查询

时间:2016-10-13 13:47:41

标签: elasticsearch geohashing

我在弹性搜索中有以下映射:

{
  "mappings": {
    "event": {
      "_all":       { "enabled": false  },
      "properties": {
        "type":     { "type": "string", "index": "not_analyzed"},
        "id":  { "type": "string"},
        "location": { "type": "geo_point"}
      }
    }
  }
} 

我想要做的是查询由单个geohash定义的地图区域内的所有记录。 我知道geohash单元格查询在我的示例中可以完美地工作,但不幸的是要求geo_point字段被索引,并且geohash_prefix选项设置为true,这在elasticearch 2.4中已弃用。

在最新的elasticsearch版本中,这样做的正确方法是什么?我无法在文档中的任何位置找到它。

2 个答案:

答案 0 :(得分:1)

Elasticsearch 6.0.0-alpha2 documentation says以下内容:

  

已删除geohash_cell查询。而是使用地理边界框查询

尝试将bottom_left bounding box参数指定为your_geohash_prefix + '00...0',将top_right指定为your_geohash_prefix + 'zz...z'。您应该在geohash前缀中添加尽可能多的0z符号,使其长度为12(最大精度geohash长度)。

E.g。对于geohash前缀dr5r9,它看起来像:

{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_bounding_box" : {
                    "coordinates" : {
                        "bottom_left" : "dr5r90000000",
                        "top_right" : "dr5r9zzzzzzz"
                    }
                }
            }
        }
    }
}

0z分别作为geohash网格的左下角和右上角。

我成功地通过这种方法测试它,通过比较匹配的文档计数与相应精度的geohash网格聚合结果。但是我仍然有一些情况说有些观点没有落入这样的边界框内。不能说它是100%正确的方法。

答案 1 :(得分:0)

要获取所有要点,请尝试像Sergii的答案一样添加0z,但不要解码并使用带有上,左,下,右的geo_bounding_box查询。

dr5r90000000->经度:-74.13574202,纬度:40.69335946

dr5r90zzzzzz->经度:-74.12475603,纬度:40.69885246

{
    "query": {
        "bool" : {
            "must" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_bounding_box" : {
                    "coordinates" : {
                        "top": 40.69885246,
                        "left": -74.13574202,
                        "bottom": 40.69335946,
                        "right": -74.12475603,
                    }
                }
            }
        }
    }
}