Запрос гео-многоугольника
Устарело в 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 }
]
}
}
}
}
}
} Параметры запроса
| Параметр | Описание |
|---|---|
| Необязательное поле имени для идентификации фильтра |
| Установите в значение |
Разрешённые форматы
Широта/долгота как массив
Формат как [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