原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-shape-query.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/query-dsl-shape-query.html
本地英文版地址: ../en/query-dsl-shape-query.html
重要: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 当前版本文档。
查询包含使用shape类型索引的字段的文档。
要求shape映射。
该查询支持两种定义目标形状的方法,要么提供完整的形状定义,要么引用在另一个索引中预索引的形状的名称或id。这两种格式都在下面用例子进行了定义。
与geo_shape查询类似,shape查询使用GeoJSON或众所周知的文本(WKT)来表示形状。
我们来建立一个名为example的索引,新增并索引一个id为1的文档
PUT /example
{
"mappings": {
"properties": {
"geometry": {
"type": "shape"
}
}
}
}
# 新增并索引一个id为1的文档
PUT /example/_doc/1?refresh=wait_for
{
"name": "Lucky Landing",
"geometry": {
"type": "point",
"coordinates": [1355.400544, 5255.530286]
}
}
下面这个查询将使用Elasticsearch的envelopeGeoJSON扩展查找坐标点:
GET /example/_search
{
"query":{
"shape": {
"geometry": {
"shape": {
"type": "envelope",
"coordinates" : [[1355.0, 5355.0], [1400.0, 5200.0]]
},
"relation": "within"
}
}
}
}
该查询还支持使用已经在另一个索引中索引了的形状。 当你有一个预定义的形状列表,并且想使用逻辑名称(例如 New Zealand)引用该列表,而不是每次都必须提供坐标时,特别有用。 在这种情况下,只需提供:
-
id- 预索引形状的文档ID。 -
index- 预索引形状所在的索引的名称。默认为shapes。 -
path- 指定包含预索引形状的路径的字段。默认为shape。 -
routing- 形状文档的路由(如果需要)。
下面是一个将过滤用于预索引形状的示例。我们先建立一个名为shapes的索引,然后索引一个文档进去,文档ID为footprint。这里还用到了最上面建立的example索引。
# 建索引
PUT /shapes
{
"mappings": {
"properties": {
"geometry": {
"type": "shape"
}
}
}
}
# 添加并索引一个文档,id为footprint
PUT /shapes/_doc/footprint
{
"geometry": {
"type": "envelope",
"coordinates" : [[1355.0, 5355.0], [1400.0, 5200.0]]
}
}
# 搜索
GET /example/_search
{
"query": {
"shape": {
"geometry": {
"indexed_shape": {
"index": "shapes",
"id": "footprint",
"path": "geometry"
}
}
}
}
}
以下是可用空间关系运算符的完整列表:
-
INTERSECTS- (默认) 返回shape字段与查询几何形状 相交 的所有文档。 -
DISJOINT- 返回shape字段与查询几何形状 完全不同 的所有文档。 -
WITHIN- 返回shape字段 包含于 查询几何形状中的所有文档。 -
CONTAINS- 返回shape字段 包含 查询几何形状中的所有文档。
忽略未映射的字段 (ignore unmapped)
如果ignore_unmapped选项设置为true,将忽略未映射的字段,并且此查询不会匹配任何文档。
这在查询可能具有不同映射的多个索引时非常有用。
当设置为false(默认值)时,如果字段未映射,查询将抛出异常。