{ref}/query-dsl-geo-shape-query.html[geo_shape
查询]不寻常的地方在于,它允许我们使用形状来做查询,而不仅仅是坐标点。
举个例子,当我们的用户刚刚迈出阿姆斯特丹中央火车站时,我们可以用如下方式,查询出方圆 1km 内的所有地标:
GET /attractions/landmark/_search
{
"query": {
"geo_shape": {
"location": { (1)
"shape": { (2)
"type": "circle", (3)
"radius": "1km",
"coordinates": [ (4)
4.89994,
52.37815
]
}
}
}
}
}
-
查询使用
location
字段中的地理形状。 -
查询中的形状是由
shape
键对应的内容表示。 -
形状是一个半径为 1km 的圆形。
-
安姆斯特丹中央火车站入口的坐标点。
默认的,查询(或者过滤器 —— 工作方式相同)会从已索引的形状中寻找与指定形状有交集的部分。此外,可以把 relation
字段设置为 disjoint
来查找与指定形状不相交的部分,或者设置为 within
来查找完全落在查询形状中的。
举个例子,我们可以查找阿姆斯特丹中心区域所有的地标:
GET /attractions/landmark/_search
{
"query": {
"geo_shape": {
"location": {
"relation": "within", (1)
"shape": {
"type": "polygon",
"coordinates": [[ (2)
[4.88330,52.38617],
[4.87463,52.37254],
[4.87875,52.36369],
[4.88939,52.35850],
[4.89840,52.35755],
[4.91909,52.36217],
[4.92656,52.36594],
[4.93368,52.36615],
[4.93342,52.37275],
[4.92690,52.37632],
[4.88330,52.38617]
]]
}
}
}
}
}
-
只匹配完全落在查询形状中的已索引的形状。
-
这个多边形表示安姆斯特丹中心区域。