#elasticsearch #geohashing
#elasticsearch #геохеширование
Вопрос:
У меня есть следующее отображение в моем elasticsearch:
{
"mappings": {
"event": {
"_all": { "enabled": false },
"properties": {
"type": { "type": "string", "index": "not_analyzed"},
"id": { "type": "string"},
"location": { "type": "geo_point"}
}
}
}
}
То, что я хочу сделать, это запросить все записи, которые локализованы внутри области карты, определяемой одним геохешем.
Я знаю о запросе ячейки geohash, который отлично работал бы в моем примере, но, к сожалению, требуется, чтобы поле geo_point было проиндексировано с параметром geohash_prefix, установленным в true, который устарел в elasticearch 2.4.
Каков правильный способ сделать это в последней версии elasticsearch? Я не могу найти его нигде в документации.
Ответ №1:
В документации Elasticsearch 6.0.0-alpha2 говорится следующее:
Запрос geohash_cell был удален. Вместо этого используйте запрос, ограничивающий географическую рамку
Попробуйте указать аргумент bottom_left
ограничивающей рамки as your_geohash_prefix '00...0'
и top_right
as your_geohash_prefix 'zz...z'
. Вы должны добавить столько 0
z
символов и к вашему префиксу георешетки, чтобы он имел длину 12 (максимальная точность длины георешетки).
Например, для префикса geohash dr5r9
это будет выглядеть так:
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_bounding_box" : {
"coordinates" : {
"bottom_left" : "dr5r90000000",
"top_right" : "dr5r9zzzzzzz"
}
}
}
}
}
}
0
и z
где берется как нижний левый и верхний правый углы сетки geohash соответственно.
Мне удалось протестировать этот подход, сравнив количество совпадающих документов с результатом агрегирования сетки geohash соответствующей точности. Но все же у меня были случаи, когда некоторые точки не попадали в такую ограничивающую рамку. Не могу сказать, что это на 100% правильный метод.
Ответ №2:
Чтобы получить все точки, попробуйте добавить 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,
}
}
}
}
}
}