Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Query DSL ›Geo queries

Запрос по расстоянию до геолокации

Совпадение значений geo_point и geo_shape в пределах заданного расстояния от геокоординаты.

Пример

Предполагаются следующие проиндексированные документы:

PUT /my_locations
{
  "mappings": {
    "properties": {
      "pin": {
        "properties": {
          "location": {
            "type": "geo_point"
          }
        }
      }
    }
  }
}

PUT /my_locations/_doc/1
{
  "pin": {
    "location": {
      "lat": 40.12,
      "lon": -71.34
    }
  }
}

PUT /my_geoshapes
{
  "mappings": {
    "properties": {
      "pin": {
        "properties": {
          "location": {
            "type": "geo_shape"
          }
        }
      }
    }
  }
}

PUT /my_geoshapes/_doc/1
{
  "pin": {
    "location": {
      "type" : "polygon",
      "coordinates" : [[[13.0 ,51.5], [15.0, 51.5], [15.0, 54.0], [13.0, 54.0], [13.0 ,51.5]]]
    }
  }
}

Используйте фильтр geo_distance, чтобы найти значения geo_point в пределах заданного расстояния от другой геокоординаты:

GET /my_locations/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "200km",
          "pin.location": {
            "lat": 40,
            "lon": -70
          }
        }
      }
    }
  }
}

Используйте тот же фильтр, чтобы найти значения geo_shape в заданном радиусе:

GET my_geoshapes/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "200km",
          "pin.location": {
            "lat": 40,
            "lon": -70
          }
        }
      }
    }
  }
}

Чтобы найти совпадения по значениям geo_point и geo_shape, выполните поиск по обоим индексам:

GET my_locations,my_geoshapes/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "200km",
          "pin.location": {
            "lat": 40,
            "lon": -70
          }
        }
      }
    }
  }
}

Поддерживаемые форматы

Так же, как и тип geo_point может принимать различные представления геокоординат, фильтр также может их принимать:

Широта и долгота как свойства
GET /my_locations/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "12km",
          "pin.location": {
            "lat": 40,
            "lon": -70
          }
        }
      }
    }
  }
}
Широта и долгота как массив

Формат в [lon, lat], обратите внимание на порядок lon/lat для соответствия GeoJSON.

GET /my_locations/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "12km",
          "pin.location": [ -70, 40 ]
        }
      }
    }
  }
}
Широта и долгота как строка

Формат в lat,lon.

GET /my_locations/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "12km",
          "pin.location": "40,-70"
        }
      }
    }
  }
}
Geohash
GET /my_locations/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_distance": {
          "distance": "12km",
          "pin.location": "drm3btev3e86"
        }
      }
    }
  }
}

Параметры

Допустимые параметры фильтра:

distance

Радиус окружности с центром в указанном местоположении. Точки, попадающие в эту окружность, считаются совпадающими. Радиус может быть указан в различных единицах измерения. Смотрите Единицы измерения расстояния.

distance_type

Способ вычисления расстояния. Может быть arc (по умолчанию) или plane (быстрее, но менее точно на больших расстояниях и близко к полюсам).

_name

Дополнительное имя поля для идентификации запроса

validation_method

Установите в IGNORE_MALFORMED, чтобы принять геокоординаты с недопустимой широтой или долготой, установите в COERCE, чтобы дополнительно попытаться определить правильные координаты (по умолчанию STRICT).

Несколько местоположений на документ

Фильтр geo_distance может работать с несколькими местоположениями/точками на документ. После того, как один из местоположений/точек совпадет с фильтром, документ будет включен.

Игнорировать неотображенные

Когда установлено значение true, параметр ignore_unmapped будет игнорировать неотображенное поле и не будет подбирать документы для этого запроса. Это может быть полезно при запросе к нескольким индексам, которые могут иметь различные отображения. При установке значения false (значение по умолчанию) запрос выдаст исключение, если поле не отображено.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-geo-distance-query.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API