Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Query DSL ›Geo queries

Запрос гео-многоугольника

Устарело в 7.12.

Вместо этого используйте Geoshape, где многоугольники определены в формате GeoJSON или Well-Known Text (WKT).

Запрос, возвращающий совпадения, которые попадают только в пределах многоугольника точек. Вот пример:

resp = client.search(
    query={
        "bool": {
            "must": {
                "match_all": {}
            },
            "filter": {
                "geo_polygon": {
                    "person.location": {
                        "points": [
                            {
                                "lat": 40,
                                "lon": -70
                            },
                            {
                                "lat": 30,
                                "lon": -80
                            },
                            {
                                "lat": 20,
                                "lon": -90
                            }
                        ]
                    }
                }
            }
        }
    },
)
print(resp)
const response = await client.search({
  query: {
    bool: {
      must: {
        match_all: {},
      },
      filter: {
        geo_polygon: {
          "person.location": {
            points: [
              {
                lat: 40,
                lon: -70,
              },
              {
                lat: 30,
                lon: -80,
              },
              {
                lat: 20,
                lon: -90,
              },
            ],
          },
        },
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_polygon": {
          "person.location": {
            "points": [
              { "lat": 40, "lon": -70 },
              { "lat": 30, "lon": -80 },
              { "lat": 20, "lon": -90 }
            ]
          }
        }
      }
    }
  }
}

Параметры запроса

Параметр Описание

_name

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

validation_method

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

Разрешённые форматы

Широта/долгота как массив

Формат как [lon, lat]

Примечание: порядок lon/lat здесь должен соответствовать GeoJSON.

resp = client.search(
    query={
        "bool": {
            "must": {
                "match_all": {}
            },
            "filter": {
                "geo_polygon": {
                    "person.location": {
                        "points": [
                            [
                                -70,
                                40
                            ],
                            [
                                -80,
                                30
                            ],
                            [
                                -90,
                                20
                            ]
                        ]
                    }
                }
            }
        }
    },
)
print(resp)
const response = await client.search({
  query: {
    bool: {
      must: {
        match_all: {},
      },
      filter: {
        geo_polygon: {
          "person.location": {
            points: [
              [-70, 40],
              [-80, 30],
              [-90, 20],
            ],
          },
        },
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_polygon": {
          "person.location": {
            "points": [
              [ -70, 40 ],
              [ -80, 30 ],
              [ -90, 20 ]
            ]
          }
        }
      }
    }
  }
}
Широта/долгота как строка

Формат в lat,lon.

resp = client.search(
    query={
        "bool": {
            "must": {
                "match_all": {}
            },
            "filter": {
                "geo_polygon": {
                    "person.location": {
                        "points": [
                            "40, -70",
                            "30, -80",
                            "20, -90"
                        ]
                    }
                }
            }
        }
    },
)
print(resp)
const response = await client.search({
  query: {
    bool: {
      must: {
        match_all: {},
      },
      filter: {
        geo_polygon: {
          "person.location": {
            points: ["40, -70", "30, -80", "20, -90"],
          },
        },
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_polygon": {
          "person.location": {
            "points": [
              "40, -70",
              "30, -80",
              "20, -90"
            ]
          }
        }
      }
    }
  }
}
Geohash
resp = client.search(
    query={
        "bool": {
            "must": {
                "match_all": {}
            },
            "filter": {
                "geo_polygon": {
                    "person.location": {
                        "points": [
                            "drn5x1g8cu2y",
                            "30, -80",
                            "20, -90"
                        ]
                    }
                }
            }
        }
    },
)
print(resp)
const response = await client.search({
  query: {
    bool: {
      must: {
        match_all: {},
      },
      filter: {
        geo_polygon: {
          "person.location": {
            points: ["drn5x1g8cu2y", "30, -80", "20, -90"],
          },
        },
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_polygon": {
          "person.location": {
            "points": [
              "drn5x1g8cu2y",
              "30, -80",
              "20, -90"
            ]
          }
        }
      }
    }
  }
}

Тип geo_point

Запрос требует типа geo_point для установленного соответствующего поля.

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

При установке в 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/8.17/query-dsl-geo-polygon-query.html

Spec-Zone.ru

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