xy запрос

Для поиска документов, содержащих поля xy point или xy shape, используйте xy запрос.

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

Когда вы предоставляете xy форму в xy запросе, поля xy в документах сопоставляются с использованием следующих пространственных отношений к предоставленной форме.

Отношение Описание Поддерживаемый тип поля xy
INTERSECTS (По умолчанию) Сопоставляет документы, чьи xy point или xy shape пересекают форму, предоставленную в запросе. xy_point, xy_shape
DISJOINT Сопоставляет документы, чьи xy shape не пересекаются с формой, предоставленной в запросе. xy_shape
WITHIN Сопоставляет документы, чьи xy shape полностью находятся внутри формы, предоставленной в запросе. xy_shape
CONTAINS Сопоставляет документы, чьи xy shape полностью содержат форму, предоставленную в запросе. xy_shape

Следующие примеры иллюстрируют поиск документов, содержащих xy формы. Чтобы узнать, как искать документы, содержащие xy точки, смотрите раздел “Запросы xy точек”.

Определение формы в xy запросе

Вы можете определить форму в xy запросе, предоставив новое определение формы во время запроса или сославшись на имя формы, предварительно индексированной в другом индексе.

Использование нового определения формы

Чтобы предоставить новую форму в xy запросе, определите ее в поле xy_shape.

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

Сначала создайте индекс и сопоставьте поле геометрии как xy_shape:

PUT testindex
{
  "mappings": {
    "properties": {
      "geometry": {
        "type": "xy_shape"
      }
    }
  }
}

Индексируйте документ с точкой и документ с многоугольником:

PUT testindex/_doc/1
{
  "geometry": { 
    "type": "point",
    "coordinates": [0.5, 3.0]
  }
}

PUT testindex/_doc/2
{
  "geometry" : {
    "type" : "polygon",
    "coordinates" : [
      [[2.5, 6.0],
      [0.5, 4.5], 
      [1.5, 2.0], 
      [3.5, 3.5],
      [2.5, 6.0]]
    ]
  }
}

Определите оболочку — ограничивающий прямоугольник в формате [[minX, maxY], [maxX, minY]]. Ищите документы с xy точками или формами, которые пересекают эту оболочку:

GET testindex/_search
{
  "query": {
    "xy_shape": {
      "geometry": {
        "shape": {
          "type": "envelope",
          "coordinates": [ [ 0.0, 6.0], [ 4.0, 2.0] ]
        },
        "relation": "WITHIN"
      }
    }
  }
}

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

xy

Использование предварительно индексированного определения формы

При построении xy запроса вы также можете ссылаться на имя формы, предварительно индексированной в другом индексе. Используя этот метод, вы можете определить xy форму во время индексации и ссылаться на нее по имени, предоставляя следующие параметры в объекте indexed_shape.

Параметр Описание
index Имя индекса, содержащего предварительно индексированную форму.
id Идентификатор документа, содержащего предварительно индексированную форму.
path Имя поля, содержащего предварительно индексированную форму, в виде пути.

Следующий пример иллюстрирует ссылку на имя формы, предварительно индексированной в другом индексе. В этом примере индекс pre-indexed-shapes содержит форму, определяющую границы, а индекс testindex содержит формы, местоположения которых проверяются относительно этих границ.

Сначала создайте индекс pre-indexed-shapes и сопоставьте поле геометрии для этого индекса как xy_shape:

PUT pre-indexed-shapes
{
  "mappings": {
    "properties": {
      "geometry": {
        "type": "xy_shape"
      }
    }
  }
}

Индексируйте оболочку, которая определяет границы, и назовите ее rectangle:

PUT pre-indexed-shapes/_doc/rectangle
{
  "geometry": {
    "type": "envelope",
    "coordinates" : [ [ 0.0, 6.0], [ 4.0, 2.0] ]
  }
}

Индексируйте документ с точкой и документ с многоугольником в индекс testindex:

PUT testindex/_doc/1
{
  "geometry": { 
    "type": "point",
    "coordinates": [0.5, 3.0]
  }
}

PUT testindex/_doc/2
{
  "geometry" : {
    "type" : "polygon",
    "coordinates" : [
      [[2.5, 6.0],
      [0.5, 4.5], 
      [1.5, 2.0], 
      [3.5, 3.5],
      [2.5, 6.0]]
    ]
  }
}

Теперь выполните поиск документов с формами, которые пересекают rectangle в индексе testindex, используя фильтр:

GET testindex/_search
{
  "query": {
    "bool": {
      "filter": {
        "xy_shape": {
          "geometry": {
            "indexed_shape": {
              "index": "pre-indexed-shapes",
              "id": "rectangle",
              "path": "geometry"
            }
          }
        }
      }
    }
  }
}

Этот запрос вернет документы из индекса testindex, которые пересекают предварительно индексированную форму rectangle, определенную в индексе pre-indexed-shapes.

Запрос xy точек

Вы также можете использовать xy запрос для поиска документов, содержащих xy точки.

Создание сопоставления с типом xy_point

Сначала создайте сопоставление с полем типа xy_point:

PUT testindex1
{
  "mappings": {
    "properties": {
      "point": {
        "type": "xy_point"
      }
    }
  }
}

Индексация трех точек

Индексируйте три точки:

PUT testindex1/_doc/1
{
  "point": "1.0, 1.0" 
}

PUT testindex1/_doc/2
{
  "point": "2.0, 0.0" 
}

PUT testindex1/_doc/3
{
  "point": "-2.0, 2.0" 
}

Поиск точек в круге

Теперь выполните поиск точек, которые находятся внутри круга с центром в (0, 0) и радиусом 2:

GET testindex1/_search
{
  "query": {
    "xy_shape": {
      "point": {
        "shape": {
          "type": "circle",
          "coordinates": [0.0, 0.0],
          "radius": 2
        }
      }
    }
  }
}

Форма xy point поддерживает только пространственное отношение по умолчанию INTERSECTS, поэтому вам не нужно указывать параметр отношения.

Результаты запроса

Следующее изображение иллюстрирует пример. Точки 1 и 2 находятся внутри круга, а точка 3 находится вне круга.

xy2

Ответ на запрос возвращает документы 1 и 2, которые находятся внутри заданного круга:

{
  "took" : 575,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "testindex1",
        "_id" : "1",
        "_score" : 0.0,
        "_source" : {
          "point" : "1.0, 1.0"
        }
      },
      {
        "_index" : "testindex1",
        "_id" : "2",
        "_score" : 0.0,
        "_source" : {
          "point" : "2.0, 0.0"
        }
      }
    ]
  }
}

Объяснение результатов

  • Документ 1: Содержит точку с координатами (1.0, 1.0), которая находится внутри круга.
  • Документ 2: Содержит точку с координатами (2.0, 0.0), которая также находится внутри круга.

Обе точки соответствуют критериям поиска, так как они находятся в пределах радиуса 2 от центра (0, 0). Точка 3, с координатами (-2.0, 2.0), не была возвращена, так как она находится вне круга.