Эластичный поиск 2.4 Запрос ячейки Geohash

#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,
                    }
                }
            }
        }
    }
}