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

Запрос геоформы

Фильтрует документы, индексированные с использованием типа geo_shape или geo_point.

Требует geo_shape отображение или geo_point отображение.

Запрос geo_shape использует ту же схему представления ячейки сетки, что и geo_shape отображение, для поиска документов, имеющих форму, пересекающую форму запроса. Он также будет использовать ту же конфигурацию префиксного дерева, что и для отображения поля.

Запрос поддерживает два способа определения формы запроса: либо путем предоставления всей определения формы, либо путем ссылки на имя формы, предварительно индексированной в другом индексе. Оба формата определены ниже с примерами.

Определение формы в строке

Подобно типу geo_shape, запрос geo_shape использует GeoJSON для представления форм.

Учитывая следующий индекс с полями местоположений, как geo_shape:

PUT /example
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape"
      }
    }
  }
}

POST /example/_doc?refresh
{
  "name": "Wind & Wetter, Berlin, Germany",
  "location": {
    "type": "point",
    "coordinates": [ 13.400544, 52.530286 ]
  }
}

Следующий запрос найдет точку, используя расширение GeoJSON Elasticsearch’s envelope:

GET /example/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_shape": {
          "location": {
            "shape": {
              "type": "envelope",
              "coordinates": [ [ 13.0, 53.0 ], [ 14.0, 52.0 ] ]
            },
            "relation": "within"
          }
        }
      }
    }
  }
}

Этот запрос аналогичным образом может быть использован для полей geo_point.

PUT /example_points
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      }
    }
  }
}

PUT /example_points/_doc/1?refresh
{
  "name": "Wind & Wetter, Berlin, Germany",
  "location": [13.400544, 52.530286]
}

Используя тот же запрос, возвращаются документы с соответствующими полями geo_point.

GET /example_points/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_shape": {
          "location": {
            "shape": {
              "type": "envelope",
              "coordinates": [ [ 13.0, 53.0 ], [ 14.0, 52.0 ] ]
            },
            "relation": "intersects"
          }
        }
      }
    }
  }
}
{
  "took" : 17,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "example_points",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name": "Wind & Wetter, Berlin, Germany",
          "location": [13.400544, 52.530286]
        }
      }
    ]
  }
}

Предварительно индексированная форма

Запрос также поддерживает использование формы, которая уже была индексирована в другом индексе. Это особенно полезно, когда у вас есть предварительно определенный список форм, и вы хотите сослаться на список с помощью логического имени (например, Новая Зеландия), а не каждый раз предоставлять координаты. В этом случае необходимо только указать:

  • id - Идентификатор документа, содержащего предварительно индексированную форму.
  • index - Имя индекса, где находится предварительно индексированная форма. По умолчанию shapes.
  • path - Указанное поле, содержащее путь к предварительно индексированной форме. По умолчанию shape.
  • routing - Маршрутизация документа формы, если требуется.

Следующий пример использования фильтра с предварительно индексированной формой:

PUT /shapes
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape"
      }
    }
  }
}

PUT /shapes/_doc/deu
{
  "location": {
    "type": "envelope",
    "coordinates" : [[13.0, 53.0], [14.0, 52.0]]
  }
}

GET /example/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_shape": {
          "location": {
            "indexed_shape": {
              "index": "shapes",
              "id": "deu",
              "path": "location"
            }
          }
        }
      }
    }
  }
}

Пространственные отношения

Параметр отображения geo_shape strategy определяет, какие пространственные операторы могут быть использованы во время поиска.

Ниже приведен полный список пространственных операторов, доступных при поиске геополя:

  • INTERSECTS - (по умолчанию) Возвращает все документы, чье поле geo_shape или geo_point пересекает геометрию запроса.
  • DISJOINT - Возвращает все документы, чье поле geo_shape или geo_point не имеет ничего общего с геометрией запроса.
  • WITHIN - Возвращает все документы, чье поле geo_shape или geo_point находится внутри геометрии запроса. Линейные геометрии не поддерживаются.
  • CONTAINS - Возвращает все документы, чье поле geo_shape или geo_point содержит геометрию запроса.

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

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

Примечания

  • Geo-shape запросы по geo-формам, реализованным с помощью PrefixTrees, не будут выполняться, если search.allow_expensive_queries установлено в значение false.
  • Когда данные индексируются в поле geo_shape в виде массива форм, массивы обрабатываются как одна форма. По этой причине следующие запросы эквивалентны.
PUT /test/_doc/1
{
  "location": [
    {
      "coordinates": [46.25,20.14],
      "type": "point"
    },
    {
      "coordinates": [47.49,19.04],
      "type": "point"
    }
  ]
}
PUT /test/_doc/1
{
  "location":
    {
      "coordinates": [[46.25,20.14],[47.49,19.04]],
      "type": "multipoint"
    }
}
  • Запрос geo_shape предполагает, что поля geo_shape используют по умолчанию orientation RIGHT (против часовой стрелки). См. Ориентация многоугольника.

© 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-shape-query.html

Spec-Zone.ru

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