我在弹性搜索中有以下映射:
{
"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版本中,这样做的正确方法是什么?我无法在文档中的任何位置找到它。
答案 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前缀中添加尽可能多的0
和z
符号,使其长度为12(最大精度geohash长度)。
E.g。对于geohash前缀dr5r9
,它看起来像:
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_bounding_box" : {
"coordinates" : {
"bottom_left" : "dr5r90000000",
"top_right" : "dr5r9zzzzzzz"
}
}
}
}
}
}
0
和z
分别作为geohash网格的左下角和右上角。
我成功地通过这种方法测试它,通过比较匹配的文档计数与相应精度的geohash网格聚合结果。但是我仍然有一些情况说有些观点没有落入这样的边界框内。不能说它是100%正确的方法。
答案 1 :(得分:0)
要获取所有要点,请尝试像Sergii的答案一样添加0
和z
,但不要解码并使用带有上,左,下,右的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,
}
}
}
}
}
}