原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-shape-query.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/query-dsl-shape-query.html

形状(shape)查询

查询包含使用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"
            }
        }
    }
}

预索引的形状(pre-indexed shape)

该查询还支持使用已经在另一个索引中索引了的形状。 当你有一个预定义的形状列表,并且想使用逻辑名称(例如 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"
                }
            }
        }
    }
}

空间关系 (spatial relations)

以下是可用空间关系运算符的完整列表:

  • INTERSECTS - (默认) 返回shape字段与查询几何形状 相交 的所有文档。
  • DISJOINT - 返回shape字段与查询几何形状 完全不同 的所有文档。
  • WITHIN - 返回shape字段 包含于 查询几何形状中的所有文档。
  • CONTAINS - 返回shape字段 包含 查询几何形状中的所有文档。

忽略未映射的字段 (ignore unmapped)

如果ignore_unmapped选项设置为true,将忽略未映射的字段,并且此查询不会匹配任何文档。 这在查询可能具有不同映射的多个索引时非常有用。 当设置为false(默认值)时,如果字段未映射,查询将抛出异常。