ElasticSearch Query DSL(四)
地理查询
地理距离查询
查找与中心点的指定距离内具有地理点的文档。一个地理位置点方圆几公里内的所有文档。
例子
假设以下文档被索引:
curl -X PUT "localhost:9200/my_locations?pretty" -H 'Content-Type: application/json' -d'
{
"mappings": {
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}
}
'
curl -X PUT "localhost:9200/my_locations/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"pin": {
"location": {
"lat": 40.12,
"lon": -71.34
}
}
}
'
curl -X PUT "localhost:9200/my_geoshapes?pretty" -H 'Content-Type: application/json' -d'
{
"mappings": {
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_shape"
}
}
}
}
}
}
'
curl -X PUT "localhost:9200/my_geoshapes/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"pin": {
"location": {
"type" : "polygon",
"coordinates" : [[[13.0 ,51.5], [15.0, 51.5], [15.0, 54.0], [13.0, 54.0], [13.0 ,51.5]]]
}
}
}
'
使用geo_distance
过滤器来匹配一个地理点到指定距离内的geo_point
值。
curl -X GET "localhost:9200/my_locations/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
}
}
'
使用相同的过滤器来匹配给定距离内的 geo_shape
值:
curl -X GET "localhost:9200/my_geoshapes/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
}
}
'
要匹配 geo_point 和 geo_shape 值,请搜索两个索引:
curl -X GET "localhost:9200/my_locations,my_geoshapes/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "200km",
"pin.location": {
"lat": 40,
"lon": -70
}
}
}
}
}
}
'
形状查询
查询包含shape
类型字段索引的文档。
需要shape
映射
查询支持两种方式,第一种是提供完整的形状定义,第二种是引用另一个索引中预先索引的形状名称或者id。下边是这两种方式的定义:
内联形状定义
与geo_shape
查询类似,shape
查询使用GeoJSON
或者WKT
来表示形状。
给定以下索引:
curl -X PUT "localhost:9200/example?pretty" -H 'Content-Type: application/json' -d'
{
"mappings": {
"properties": {
"geometry": {
"type": "shape"
}
}
}
}
'
curl -X PUT "localhost:9200/example/_doc/1?refresh=wait_for&pretty" -H 'Content-Type: application/json' -d'
{
"name": "Lucky Landing",
"geometry": {
"type": "point",
"coordinates": [ 1355.400544, 5255.530286 ]
}
}
'
以下查询将使用ElasticSearch的GeoJSON envelope
扩展找到该点:
curl -X GET "localhost:9200/example/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"shape": {
"geometry": {
"shape": {
"type": "envelope",
"coordinates": [ [ 1355.0, 5355.0 ], [ 1400.0, 5200.0 ] ]
},
"relation": "within"
}
}
}
}
'
预索引形状
该查询也支持使用在其他索引中已经被索引的形状。当您有一个预定义的形状列表,并且对您的应用程序非常有用,并且您希望使用一个逻辑名称(例如New Zealand)来引用它,而不是每次都必须提供它们的坐标时,这特别有用。在这种情况下,只需提供:
id
- 包含预索引形状的文档的 ID。index
- 预索引形状所在的索引名称。默认为形状。path
- 指定为包含预索引形状的路径的字段。默认为形状。routing
- 如果需要,形状文档的路由。
以下是使用具有预索引形状的过滤器的示例:
curl -X PUT "localhost:9200/shapes?pretty" -H 'Content-Type: application/json' -d'
{
"mappings": {
"properties": {
"geometry": {
"type": "shape"
}
}
}
}
'
curl -X PUT "localhost:9200/shapes/_doc/footprint?pretty" -H 'Content-Type: application/json' -d'
{
"geometry": {
"type": "envelope",
"coordinates": [ [ 1355.0, 5355.0 ], [ 1400.0, 5200.0 ] ]
}
}
'
curl -X GET "localhost:9200/example/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"shape": {
"geometry": {
"indexed_shape": {
"index": "shapes",
"id": "footprint",
"path": "geometry"
}
}
}
}
}
'
空间关系
以下是可用空间关系运算符的完整列表:
INTERSECTS
-(默认)返回shape
字段与查询几何图形相交的所有文档。DISJOINT
- 返回其shape
字段与查询几何没有共同之处的所有文档。WITHIN
- 返回其shape
字段在查询几何范围内的所有文档。CONTAINS
- 返回其shape
字段包含查询几何的所有文档。