矢量瓦片搜索 API

编辑

搜索矢量瓦片中的地理空间值。以二进制 Mapbox 矢量瓦片 的形式返回结果。

resp = client.search_mvt(
    index="my-index",
    field="my-geo-field",
    zoom="15",
    x="5271",
    y="12710",
)
print(resp)
const response = await client.searchMvt({
  index: "my-index",
  field: "my-geo-field",
  zoom: 15,
  x: 5271,
  y: 12710,
});
console.log(response);
GET my-index/_mvt/my-geo-field/15/5271/12710

请求

编辑

GET <target>/_mvt/<field>/<zoom>/<x>/<y>

POST <target>/_mvt/<field>/<zoom>/<x>/<y>

前提条件

编辑

路径参数

编辑
<target>

(必需,字符串) 要搜索的数据流、索引或别名的逗号分隔列表。支持通配符 (*)。要搜索所有数据流和索引,请省略此参数或使用 *_all

要搜索远程集群,请使用 <cluster>:<target> 语法。请参阅 跨集群搜索

<field>

(必需,字符串) 包含要返回的地理空间值的字段。必须是 geo_pointgeo_shape 字段。该字段必须启用 doc values。不能是嵌套字段。

矢量瓦片本身不支持几何图形集合。对于 geo_shape 字段中的 geometrycollection 值,API 为集合的每个元素返回一个 hits 层要素。此行为可能会在未来的版本中更改。

<zoom>
(必需,整数) 要搜索的矢量瓦片的缩放级别。接受 0-29
<x>
(必需,整数) 要搜索的矢量瓦片的 X 坐标。
<y>
(必需,整数) 要搜索的矢量瓦片的 Y 坐标。

描述

编辑

在内部,Elasticsearch 将矢量瓦片搜索 API 请求转换为包含以下内容的 搜索

  • 一个关于 <field>geo_bounding_box 查询。该查询使用 <zoom>/<x>/<y> 瓦片作为边界框。
  • 一个关于 <field>geotile_gridgeohex_grid 聚合。 grid_agg 参数确定聚合类型。聚合使用 <zoom>/<x>/<y> 瓦片作为边界框。
  • 可选地,一个关于 <field>geo_bounds 聚合。只有当 exact_bounds 参数为 true 时,搜索才包含此聚合。
  • 如果可选参数 with_labels 为 true,则内部搜索将包含一个动态运行时字段,该字段调用几何 doc 值的 getLabelPosition 函数。这使得能够生成包含建议几何标签的新点要素,例如,多边形将只有一个标签。

例如,Elasticsearch 可以将 grid_agg 参数为 geotileexact_bounds 参数为 true 的矢量瓦片搜索 API 请求转换为以下搜索

resp = client.search(
    index="my-index",
    size=10000,
    query={
        "geo_bounding_box": {
            "my-geo-field": {
                "top_left": {
                    "lat": -40.979898069620134,
                    "lon": -45
                },
                "bottom_right": {
                    "lat": -66.51326044311186,
                    "lon": 0
                }
            }
        }
    },
    aggregations={
        "grid": {
            "geotile_grid": {
                "field": "my-geo-field",
                "precision": 11,
                "size": 65536,
                "bounds": {
                    "top_left": {
                        "lat": -40.979898069620134,
                        "lon": -45
                    },
                    "bottom_right": {
                        "lat": -66.51326044311186,
                        "lon": 0
                    }
                }
            }
        },
        "bounds": {
            "geo_bounds": {
                "field": "my-geo-field",
                "wrap_longitude": False
            }
        }
    },
)
print(resp)
const response = await client.search({
  index: "my-index",
  size: 10000,
  query: {
    geo_bounding_box: {
      "my-geo-field": {
        top_left: {
          lat: -40.979898069620134,
          lon: -45,
        },
        bottom_right: {
          lat: -66.51326044311186,
          lon: 0,
        },
      },
    },
  },
  aggregations: {
    grid: {
      geotile_grid: {
        field: "my-geo-field",
        precision: 11,
        size: 65536,
        bounds: {
          top_left: {
            lat: -40.979898069620134,
            lon: -45,
          },
          bottom_right: {
            lat: -66.51326044311186,
            lon: 0,
          },
        },
      },
    },
    bounds: {
      geo_bounds: {
        field: "my-geo-field",
        wrap_longitude: false,
      },
    },
  },
});
console.log(response);
GET my-index/_search
{
  "size": 10000,
  "query": {
    "geo_bounding_box": {
      "my-geo-field": {
        "top_left": {
          "lat": -40.979898069620134,
          "lon": -45
        },
        "bottom_right": {
          "lat": -66.51326044311186,
          "lon": 0
        }
      }
    }
  },
  "aggregations": {
    "grid": {
      "geotile_grid": {
        "field": "my-geo-field",
        "precision": 11,
        "size": 65536,
        "bounds": {
          "top_left": {
            "lat": -40.979898069620134,
            "lon": -45
          },
          "bottom_right": {
            "lat": -66.51326044311186,
            "lon": 0
          }
        }
      }
    },
    "bounds": {
      "geo_bounds": {
        "field": "my-geo-field",
        "wrap_longitude": false
      }
    }
  }
}

API 以二进制 Mapbox 矢量瓦片 的形式返回结果。Mapbox 矢量瓦片被编码为 Google Protobufs (PBF)。默认情况下,瓦片包含三个图层

  • 一个 hits 图层,其中包含与 geo_bounding_box 查询匹配的每个 <field> 值的要素。
  • 一个 aggs 图层,其中包含 geotile_gridgeohex_grid 的每个单元格的要素。该图层仅包含具有匹配数据的单元格的要素。
  • 一个 meta 图层,其中包含

    • 一个包含边界框的要素。默认情况下,这是瓦片的边界框。
    • 关于 geotile_gridgeohex_grid 的任何子聚合的值范围。
    • 搜索的元数据。

API 仅返回可以在其缩放级别上显示的要素。例如,如果一个多边形要素在其缩放级别上没有面积,则 API 会省略它。

API 以 UTF-8 编码的 JSON 形式返回错误。

查询参数

编辑

您可以为此 API 指定多个选项,作为查询参数或请求主体参数。如果您同时指定这两个参数,则查询参数优先。

exact_bounds

(可选,布尔值) 如果 false,则 meta 图层的要素是瓦片的边界框。默认为 false

如果 true,则 meta 图层的要素是 geo_bounds 聚合产生的边界框。该聚合对与 <zoom>/<x>/<y> 瓦片相交且 wrap_longitude 设置为 false<field> 值运行。生成的边界框可能大于矢量瓦片。

extent
(可选,整数) 瓦片一边的像素大小。矢量瓦片是边长相等的正方形。默认为 4096
buffer
(可选,整数) 瓦片外部裁剪缓冲区的像素大小。这允许渲染器避免来自超出瓦片范围的几何图形的轮廓伪影。默认为 5
grid_agg

(可选,字符串) 用于为 <field> 创建网格的聚合。

grid_agg 的有效值
geotile (默认)
geotile_grid 聚合。
geohex
geohex_grid 聚合。
grid_precision

(可选,整数) grid_agg 中单元格的精度级别。接受 0-8。默认为 8。如果 0,则结果不包含 aggs 图层。

geotile 的网格精度

对于 grid_agggeotile 的情况,您可以使用 aggs 图层中的单元格作为较低缩放级别的瓦片。grid_precision 表示可通过这些单元格获得的额外缩放级别。最终精度计算如下

<zoom> + grid_precision

例如,如果 <zoom>7grid_precision8,则 geotile_grid 聚合将使用 15 的精度。最大最终精度为 29

grid_precision 还确定网格的单元格数量,如下所示

(2^grid_precision) x (2^grid_precision)

例如,值 8 将瓦片划分为 256 x 256 个单元格的网格。aggs 图层仅包含具有匹配数据的单元格的要素。

geohex 的网格精度

对于 grid_agggeohex 的情况,Elasticsearch 使用 <zoom>grid_precision 计算最终精度,如下所示

<zoom> + grid_precision

此精度确定 geohex 聚合产生的六边形单元的 H3 分辨率。下表映射了每个精度的 H3 分辨率。

例如,如果 <zoom>3grid_precision3,则精度为 6。在精度为 6 时,六边形单元的 H3 分辨率为 2。如果 <zoom>3grid_precision4,则精度为 7。在精度为 7 时,六边形单元的 H3 分辨率为 3

精度 唯一瓦片箱 H3 分辨率 唯一六边形箱 比例

1

4

0

122

30.5

2

16

0

122

7.625

3

64

1

842

13.15625

4

256

1

842

3.2890625

5

1024

2

5882

5.744140625

6

4096

2

5882

1.436035156

7

16384

3

41162

2.512329102

8

65536

3

41162

0.6280822754

9

262144

4

288122

1.099098206

10

1048576

4

288122

0.2747745514

11

4194304

5

2016842

0.4808526039

12

16777216

6

14117882

0.8414913416

13

67108864

6

14117882

0.2103728354

14

268435456

7

98825162

0.3681524172

15

1073741824

8

691776122

0.644266719

16

4294967296

8

691776122

0.1610666797

17

17179869184

9

4842432842

0.2818666889

18

68719476736

10

33897029882

0.4932667053

19

274877906944

11

237279209162

0.8632167343

20

1099511627776

11

237279209162

0.2158041836

21

4398046511104

12

1660954464122

0.3776573213

22

17592186044416

13

11626681248842

0.6609003122

23

70368744177664

13

11626681248842

0.165225078

24

281474976710656

14

81386768741882

0.2891438866

25

1125899906842620

15

569707381193162

0.5060018015

26

4503599627370500

15

569707381193162

0.1265004504

27

18014398509482000

15

569707381193162

0.03162511259

28

72057594037927900

15

569707381193162

0.007906278149

29

288230376151712000

15

569707381193162

0.001976569537

六边形单元在矢量瓦片上并非完美对齐。某些单元格可能与多个矢量瓦片相交。为了计算每个精度的 H3 分辨率,Elasticsearch 将每个分辨率的六边形箱的平均密度与每个缩放级别的瓦片箱的平均密度进行比较。Elasticsearch 使用最接近相应 geotile 密度的 H3 分辨率。

grid_type

(可选,字符串) 确定 aggs 图层中要素的几何图形类型。在 aggs 图层中,每个要素表示网格中的一个单元格。

grid_type 的有效值
grid (默认)
每个要素都是单元格几何图形的 Polygon。对于 grid_agggeotile 的情况,要素是单元格的边界框。对于 grid_agggeohex 的情况,要素是六边形单元的边界。
point
每个要素都是单元格质心的 Point
centroid
每个要素都是单元格内数据的质心的 Point。对于复杂的几何图形,实际质心可能在单元格之外。在这些情况下,要素将设置为单元格内部最接近质心的点。
size
(可选,整数) 要在 hits 图层中返回的最大要素数。接受 0-10000。默认为 10000。如果 0,则结果不包含 hits 图层。
track_total_hits

(可选,整数或布尔值) 准确计数与查询匹配的命中数。默认为 10000

如果 true,则以牺牲一些性能为代价返回确切的命中数。如果 false,则响应不包括与查询匹配的命中总数。

with_labels

(可选,布尔值) 如果为 true,则 hits 和 aggs 图层将包含额外的点要素,表示原始要素的建议标签位置。

  • PointMultiPoint 要素将选择其中一个点。
  • PolygonMultiPolygon 要素将生成一个点,如果它在多边形内,则为质心,否则从 排序的三角形树 中选择多边形内的另一个点。
  • LineString 特征同样会从 三角形树 中选择一个大致的中心点。
  • 聚合结果将为每个聚合桶提供一个中心点。

原始特征的所有属性也将被复制到新的标签特征中。此外,新的特征将使用标签 _mvt_label_position 来区分。

请求主体

编辑
aggs

(可选,聚合对象grid_agg子聚合。支持以下聚合类型:

exact_bounds

(可选,布尔值) 如果 false,则 meta 图层的要素是瓦片的边界框。默认为 false

如果 true,则 meta 图层的要素是 geo_bounds 聚合产生的边界框。该聚合对与 <zoom>/<x>/<y> 瓦片相交且 wrap_longitude 设置为 false<field> 值运行。生成的边界框可能大于矢量瓦片。

extent
(可选,整数) 瓦片一边的像素大小。矢量瓦片是边长相等的正方形。默认为 4096
buffer
(可选,整数) 瓦片外部裁剪缓冲区的像素大小。这允许渲染器避免来自超出瓦片范围的几何图形的轮廓伪影。默认为 5
fields

(可选,字符串和对象的数组)要在 hits 层中返回的字段。支持通配符 (*)。

此参数不支持具有数组值的字段。具有数组值的字段可能会返回不一致的结果。

您可以在数组中将字段指定为字符串或对象。

fields 对象的属性
field
(必需,字符串)要返回的字段。支持通配符 (*)。
format

(可选,字符串)日期和地理空间字段的格式。其他字段数据类型不支持此参数。

datedate_nanos 字段接受日期格式geo_pointgeo_shape 字段接受

geojson (默认)
GeoJSON
wkt
Well Known Text(众所周知的文本)
mvt(<spec>)

二进制Mapbox 矢量瓦片。该 API 以 base64 编码的字符串形式返回瓦片。<spec> 的格式为 <zoom>/<x>/<y>,带有两个可选后缀:@<extent> 和/或 :<buffer>。例如,2/0/12/0/1@4096:5

mvt 参数
<zoom>
(必需,整数)瓦片的缩放级别。接受 0-29
<x>
(必需,整数)瓦片的 X 坐标。
<y>
(必需,整数)瓦片的 Y 坐标。
<extent>
(可选,整数) 瓦片一边的像素大小。矢量瓦片是边长相等的正方形。默认为 4096
<buffer>
(可选,整数) 瓦片外部裁剪缓冲区的像素大小。这允许渲染器避免来自超出瓦片范围的几何图形的轮廓伪影。默认为 5
grid_agg

(可选,字符串) 用于为 <field> 创建网格的聚合。

grid_agg 的有效值
geotile (默认)
geotile_grid 聚合。
geohex
geohex_grid 聚合。
grid_precision

(可选,整数) grid_agg 中单元格的精度级别。接受 0-8。默认为 8。如果 0,则结果不包含 aggs 图层。

geotile 的网格精度

对于 grid_agggeotile 的情况,您可以使用 aggs 图层中的单元格作为较低缩放级别的瓦片。grid_precision 表示可通过这些单元格获得的额外缩放级别。最终精度计算如下

<zoom> + grid_precision

例如,如果 <zoom>7grid_precision8,则 geotile_grid 聚合将使用 15 的精度。最大最终精度为 29

grid_precision 还确定网格的单元格数量,如下所示

(2^grid_precision) x (2^grid_precision)

例如,值 8 将瓦片划分为 256 x 256 个单元格的网格。aggs 图层仅包含具有匹配数据的单元格的要素。

geohex 的网格精度

对于 grid_agggeohex 的情况,Elasticsearch 使用 <zoom>grid_precision 计算最终精度,如下所示

<zoom> + grid_precision

此精度确定 geohex 聚合产生的六边形单元的 H3 分辨率。下表映射了每个精度的 H3 分辨率。

例如,如果 <zoom>3grid_precision3,则精度为 6。在精度为 6 时,六边形单元的 H3 分辨率为 2。如果 <zoom>3grid_precision4,则精度为 7。在精度为 7 时,六边形单元的 H3 分辨率为 3

精度 唯一瓦片箱 H3 分辨率 唯一六边形箱 比例

1

4

0

122

30.5

2

16

0

122

7.625

3

64

1

842

13.15625

4

256

1

842

3.2890625

5

1024

2

5882

5.744140625

6

4096

2

5882

1.436035156

7

16384

3

41162

2.512329102

8

65536

3

41162

0.6280822754

9

262144

4

288122

1.099098206

10

1048576

4

288122

0.2747745514

11

4194304

5

2016842

0.4808526039

12

16777216

6

14117882

0.8414913416

13

67108864

6

14117882

0.2103728354

14

268435456

7

98825162

0.3681524172

15

1073741824

8

691776122

0.644266719

16

4294967296

8

691776122

0.1610666797

17

17179869184

9

4842432842

0.2818666889

18

68719476736

10

33897029882

0.4932667053

19

274877906944

11

237279209162

0.8632167343

20

1099511627776

11

237279209162

0.2158041836

21

4398046511104

12

1660954464122

0.3776573213

22

17592186044416

13

11626681248842

0.6609003122

23

70368744177664

13

11626681248842

0.165225078

24

281474976710656

14

81386768741882

0.2891438866

25

1125899906842620

15

569707381193162

0.5060018015

26

4503599627370500

15

569707381193162

0.1265004504

27

18014398509482000

15

569707381193162

0.03162511259

28

72057594037927900

15

569707381193162

0.007906278149

29

288230376151712000

15

569707381193162

0.001976569537

六边形单元在矢量瓦片上并非完美对齐。某些单元格可能与多个矢量瓦片相交。为了计算每个精度的 H3 分辨率,Elasticsearch 将每个分辨率的六边形箱的平均密度与每个缩放级别的瓦片箱的平均密度进行比较。Elasticsearch 使用最接近相应 geotile 密度的 H3 分辨率。

grid_type

(可选,字符串) 确定 aggs 图层中要素的几何图形类型。在 aggs 图层中,每个要素表示网格中的一个单元格。

grid_type 的有效值
grid (默认)
每个要素都是单元格几何图形的 Polygon。对于 grid_agggeotile 的情况,要素是单元格的边界框。对于 grid_agggeohex 的情况,要素是六边形单元的边界。
point
每个要素都是单元格质心的 Point
centroid
每个要素都是单元格内数据的质心的 Point。对于复杂的几何图形,实际质心可能在单元格之外。在这些情况下,要素将设置为单元格内部最接近质心的点。
query
(可选,对象)用于过滤搜索文档的 查询 DSL
runtime_mappings

(可选,对象的对象)在搜索请求中定义一个或多个运行时字段。这些字段优先于具有相同名称的映射字段。

runtime_mappings 对象的属性
<field-name>

(必需,对象)运行时字段的配置。键是字段名称。

<field-name> 的属性
type

(必需,字符串)字段类型,可以是以下任何一种:

  • boolean
  • composite
  • date
  • double
  • geo_point
  • ip
  • keyword
  • long
  • lookup
script

(可选,字符串)在查询时执行的 Painless 脚本。该脚本可以访问文档的整个上下文,包括原始的 _source 和任何映射的字段及其值。

此脚本必须包含 emit 以返回计算值。例如

"script": "emit(doc['@timestamp'].value.dayOfWeekEnum.toString())"
size
(可选,整数) 要在 hits 图层中返回的最大要素数。接受 0-10000。默认为 10000。如果 0,则结果不包含 hits 图层。
sort

(可选,排序对象的数组)对 hits 层中的特征进行排序。

默认情况下,API 会为每个特征计算一个边界框。它根据此框的对角线长度对特征进行排序,从最长到最短。

track_total_hits

(可选,整数或布尔值) 准确计数与查询匹配的命中数。默认为 10000

如果 true,则以牺牲一些性能为代价返回确切的命中数。如果 false,则响应不包括与查询匹配的命中总数。

with_labels

(可选,布尔值) 如果为 true,则 hits 和 aggs 图层将包含额外的点要素,表示原始要素的建议标签位置。

  • PointMultiPoint 要素将选择其中一个点。
  • PolygonMultiPolygon 要素将生成一个点,如果它在多边形内,则为质心,否则从 排序的三角形树 中选择多边形内的另一个点。
  • LineString 特征同样会从 三角形树 中选择一个大致的中心点。
  • 聚合结果将为每个聚合桶提供一个中心点。

原始特征的所有属性也将被复制到新的标签特征中。此外,新的特征将使用标签 _mvt_label_position 来区分。

响应

编辑

返回的矢量瓦片包含以下数据:

hits

(对象)包含 geo_bounding_box 查询结果的图层。

hits 的属性
extent
(整数)瓦片一侧的大小,以像素为单位。矢量瓦片是等边正方形。
version
(整数)Mapbox 矢量瓦片规范的主要版本号。
features

(对象数组)特征数组。包含与 geo_bounding_box 查询匹配的每个 <field> 值的特征。

features 对象的属性
geometry

(对象)特征的几何形状。

geometry 的属性
type

(字符串)特征的几何类型。有效值为:

  • UNKNOWN
  • POINT
  • LINESTRING
  • POLYGON
coordinates
(整数数组或数组的数组)特征的瓦片坐标。
properties

(对象)特征的属性。

properties 的属性
_id
(字符串)特征的文档的 _id
_index
(字符串)特征文档的索引名称。
<field>
字段值。仅为 fields 参数中的字段返回。
type

(整数)特征几何类型的标识符。值为:

  • 1 (POINT)
  • 2 (LINESTRING)
  • 3 (POLYGON)
aggs

(对象)包含 grid_agg 聚合及其子聚合结果的图层。

aggs 的属性
extent
(整数)瓦片一侧的大小,以像素为单位。矢量瓦片是等边正方形。
version
(整数)Mapbox 矢量瓦片规范的主要版本号。
features

(对象数组)特征数组。包含网格的每个单元格的特征。

features 对象的属性
geometry

(对象)特征的几何形状。

geometry 的属性
type

(字符串)特征的几何类型。有效值为:

  • UNKNOWN
  • POINT
  • LINESTRING
  • POLYGON
coordinates
(整数数组或数组的数组)特征的瓦片坐标。
properties

(对象)特征的属性。

properties 的属性
_count
(长整型)单元格的文档计数。
_key
(字符串)单元格的桶键,格式为 <zoom>/<x>/<y>
<sub-aggregation>.value
单元格的子聚合结果。仅为 aggs 参数中的子聚合返回。
type

(整数)特征几何类型的标识符。值为:

  • 1 (POINT)
  • 2 (LINESTRING)
  • 3 (POLYGON)
meta

(对象)包含请求元数据的图层。

meta 的属性
extent
(整数)瓦片一侧的大小,以像素为单位。矢量瓦片是等边正方形。
version
(整数)Mapbox 矢量瓦片规范的主要版本号。
features

(对象数组)包含边界框的特征。

features 对象的属性
geometry

(对象)特征的几何形状。

geometry 的属性
type

(字符串)特征的几何类型。有效值为:

  • UNKNOWN
  • POINT
  • LINESTRING
  • POLYGON
coordinates
(整数数组或数组的数组)特征的瓦片坐标。
properties

(对象)特征的属性。

properties 的属性
_shards.failed
(整数)执行搜索失败的分片数。请参阅搜索 API 的 shards 响应属性。
_shards.skipped
(整数)跳过搜索的分片数。请参阅搜索 API 的 shards 响应属性。
_shards.successful
(整数)成功执行搜索的分片数。请参阅搜索 API 的 shards 响应属性。
_shards.total
(整数)需要查询的分片总数,包括未分配的分片。请参阅搜索 API 的 shards 响应属性。
aggregations._count.avg
(浮点数)aggs 图层中特征的 _count 值的平均值。
aggregations._count.count
(整数)aggs 图层中特征的唯一 _count 值的数量。
aggregations._count.max
(浮点数)aggs 图层中特征的最大 _count 值。
aggregations._count.min
(浮点数)aggs 图层中特征的最小 _count 值。
aggregations._count.sum
(浮点数)aggs 图层中特征的 _count 值之和。
aggregations.<sub-aggregation>.avg
(浮点数)子聚合结果的平均值。
aggregations.<agg_name>.count
(整数)来自子聚合结果的唯一值的数量。
aggregations.<agg_name>.max
(浮点数)来自子聚合结果的最大值。
aggregations.<agg_name>.min
(浮点数)来自子聚合结果的最小值。
aggregations.<agg_name>.sum
(浮点数)子聚合结果的值之和。
hits.max_score
(浮点数)搜索命中结果的最高文档 _score
hits.total.relation

(字符串)指示 hits.total.value 是精确值还是下限值。可能的值为:

eq
精确
gte
下限
hits.total.value
(整数)搜索命中的总数。
timed_out
(布尔值)如果为 true,则搜索在完成前超时。结果可能不完整或为空。
took
(整数)Elasticsearch 运行搜索所花费的毫秒数。请参阅搜索 API 的 took 响应属性。
type

(整数)特征几何类型的标识符。值为:

  • 1 (POINT)
  • 2 (LINESTRING)
  • 3 (POLYGON)

示例

编辑

以下请求创建 museum 索引并添加几个地理空间 location 值。

resp = client.indices.create(
    index="museums",
    mappings={
        "properties": {
            "location": {
                "type": "geo_point"
            },
            "name": {
                "type": "keyword"
            },
            "price": {
                "type": "long"
            },
            "included": {
                "type": "boolean"
            }
        }
    },
)
print(resp)

resp1 = client.bulk(
    index="museums",
    refresh=True,
    operations=[
        {
            "index": {
                "_id": "1"
            }
        },
        {
            "location": "POINT (4.912350 52.374081)",
            "name": "NEMO Science Museum",
            "price": 1750,
            "included": True
        },
        {
            "index": {
                "_id": "2"
            }
        },
        {
            "location": "POINT (4.901618 52.369219)",
            "name": "Museum Het Rembrandthuis",
            "price": 1500,
            "included": False
        },
        {
            "index": {
                "_id": "3"
            }
        },
        {
            "location": "POINT (4.914722 52.371667)",
            "name": "Nederlands Scheepvaartmuseum",
            "price": 1650,
            "included": True
        },
        {
            "index": {
                "_id": "4"
            }
        },
        {
            "location": "POINT (4.914722 52.371667)",
            "name": "Amsterdam Centre for Architecture",
            "price": 0,
            "included": True
        }
    ],
)
print(resp1)
response = client.indices.create(
  index: 'museums',
  body: {
    mappings: {
      properties: {
        location: {
          type: 'geo_point'
        },
        name: {
          type: 'keyword'
        },
        price: {
          type: 'long'
        },
        included: {
          type: 'boolean'
        }
      }
    }
  }
)
puts response

response = client.bulk(
  index: 'museums',
  refresh: true,
  body: [
    {
      index: {
        _id: '1'
      }
    },
    {
      location: 'POINT (4.912350 52.374081)',
      name: 'NEMO Science Museum',
      price: 1750,
      included: true
    },
    {
      index: {
        _id: '2'
      }
    },
    {
      location: 'POINT (4.901618 52.369219)',
      name: 'Museum Het Rembrandthuis',
      price: 1500,
      included: false
    },
    {
      index: {
        _id: '3'
      }
    },
    {
      location: 'POINT (4.914722 52.371667)',
      name: 'Nederlands Scheepvaartmuseum',
      price: 1650,
      included: true
    },
    {
      index: {
        _id: '4'
      }
    },
    {
      location: 'POINT (4.914722 52.371667)',
      name: 'Amsterdam Centre for Architecture',
      price: 0,
      included: true
    }
  ]
)
puts response
const response = await client.indices.create({
  index: "museums",
  mappings: {
    properties: {
      location: {
        type: "geo_point",
      },
      name: {
        type: "keyword",
      },
      price: {
        type: "long",
      },
      included: {
        type: "boolean",
      },
    },
  },
});
console.log(response);

const response1 = await client.bulk({
  index: "museums",
  refresh: "true",
  operations: [
    {
      index: {
        _id: "1",
      },
    },
    {
      location: "POINT (4.912350 52.374081)",
      name: "NEMO Science Museum",
      price: 1750,
      included: true,
    },
    {
      index: {
        _id: "2",
      },
    },
    {
      location: "POINT (4.901618 52.369219)",
      name: "Museum Het Rembrandthuis",
      price: 1500,
      included: false,
    },
    {
      index: {
        _id: "3",
      },
    },
    {
      location: "POINT (4.914722 52.371667)",
      name: "Nederlands Scheepvaartmuseum",
      price: 1650,
      included: true,
    },
    {
      index: {
        _id: "4",
      },
    },
    {
      location: "POINT (4.914722 52.371667)",
      name: "Amsterdam Centre for Architecture",
      price: 0,
      included: true,
    },
  ],
});
console.log(response1);
PUT museums
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      },
      "name": {
        "type": "keyword"
      },
      "price": {
        "type": "long"
      },
      "included": {
        "type": "boolean"
      }
    }
  }
}

POST museums/_bulk?refresh
{ "index": { "_id": "1" } }
{ "location": "POINT (4.912350 52.374081)", "name": "NEMO Science Museum",  "price": 1750, "included": true }
{ "index": { "_id": "2" } }
{ "location": "POINT (4.901618 52.369219)", "name": "Museum Het Rembrandthuis", "price": 1500, "included": false }
{ "index": { "_id": "3" } }
{ "location": "POINT (4.914722 52.371667)", "name": "Nederlands Scheepvaartmuseum", "price":1650, "included": true }
{ "index": { "_id": "4" } }
{ "location": "POINT (4.914722 52.371667)", "name": "Amsterdam Centre for Architecture", "price":0, "included": true }

以下请求在索引中搜索与 13/4207/2692 矢量瓦片相交的 location 值。

resp = client.search_mvt(
    index="museums",
    field="location",
    zoom="13",
    x="4207",
    y="2692",
    grid_agg="geotile",
    grid_precision=2,
    fields=[
        "name",
        "price"
    ],
    query={
        "term": {
            "included": True
        }
    },
    aggs={
        "min_price": {
            "min": {
                "field": "price"
            }
        },
        "max_price": {
            "max": {
                "field": "price"
            }
        },
        "avg_price": {
            "avg": {
                "field": "price"
            }
        }
    },
)
print(resp)
const response = await client.searchMvt({
  index: "museums",
  field: "location",
  zoom: 13,
  x: 4207,
  y: 2692,
  grid_agg: "geotile",
  grid_precision: 2,
  fields: ["name", "price"],
  query: {
    term: {
      included: true,
    },
  },
  aggs: {
    min_price: {
      min: {
        field: "price",
      },
    },
    max_price: {
      max: {
        field: "price",
      },
    },
    avg_price: {
      avg: {
        field: "price",
      },
    },
  },
});
console.log(response);
GET museums/_mvt/location/13/4207/2692
{
  "grid_agg": "geotile",
  "grid_precision": 2,
  "fields": [
    "name",
    "price"
  ],
  "query": {
    "term": {
      "included": true
    }
  },
  "aggs": {
    "min_price": {
      "min": {
        "field": "price"
      }
    },
    "max_price": {
      "max": {
        "field": "price"
      }
    },
    "avg_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}

API 以二进制矢量瓦片的形式返回结果。当解码为 JSON 时,该瓦片包含以下数据:

{
  "hits": {
    "extent": 4096,
    "version": 2,
    "features": [
      {
        "geometry": {
          "type": "Point",
          "coordinates": [
            3208,
            3864
          ]
        },
        "properties": {
          "_id": "1",
          "_index": "museums",
          "name": "NEMO Science Museum",
          "price": 1750
        },
        "type": 1
      },
      {
        "geometry": {
          "type": "Point",
          "coordinates": [
            3429,
            3496
          ]
        },
        "properties": {
          "_id": "3",
          "_index": "museums",
          "name": "Nederlands Scheepvaartmuseum",
          "price": 1650
        },
        "type": 1
      },
      {
        "geometry": {
          "type": "Point",
          "coordinates": [
            3429,
            3496
          ]
        },
        "properties": {
          "_id": "4",
          "_index": "museums",
          "name": "Amsterdam Centre for Architecture",
          "price": 0
        },
        "type": 1
      }
    ]
  },
  "aggs": {
    "extent": 4096,
    "version": 2,
    "features": [
      {
        "geometry": {
          "type": "Polygon",
          "coordinates": [
            [
              [
                3072,
                3072
              ],
              [
                4096,
                3072
              ],
              [
                4096,
                4096
              ],
              [
                3072,
                4096
              ],
              [
                3072,
                3072
              ]
            ]
          ]
        },
        "properties": {
          "_count": 3,
          "max_price.value": 1750.0,
          "min_price.value": 0.0,
          "avg_price.value": 1133.3333333333333
        },
        "type": 3
      }
    ]
  },
  "meta": {
    "extent": 4096,
    "version": 2,
    "features": [
      {
        "geometry": {
          "type": "Polygon",
          "coordinates": [
            [
              [
                0,
                0
              ],
              [
                4096,
                0
              ],
              [
                4096,
                4096
              ],
              [
                0,
                4096
              ],
              [
                0,
                0
              ]
            ]
          ]
        },
        "properties": {
          "_shards.failed": 0,
          "_shards.skipped": 0,
          "_shards.successful": 1,
          "_shards.total": 1,
          "aggregations._count.avg": 3.0,
          "aggregations._count.count": 1,
          "aggregations._count.max": 3.0,
          "aggregations._count.min": 3.0,
          "aggregations._count.sum": 3.0,
          "aggregations.avg_price.avg": 1133.3333333333333,
          "aggregations.avg_price.count": 1,
          "aggregations.avg_price.max": 1133.3333333333333,
          "aggregations.avg_price.min": 1133.3333333333333,
          "aggregations.avg_price.sum": 1133.3333333333333,
          "aggregations.max_price.avg": 1750.0,
          "aggregations.max_price.count": 1,
          "aggregations.max_price.max": 1750.0,
          "aggregations.max_price.min": 1750.0,
          "aggregations.max_price.sum": 1750.0,
          "aggregations.min_price.avg": 0.0,
          "aggregations.min_price.count": 1,
          "aggregations.min_price.max": 0.0,
          "aggregations.min_price.min": 0.0,
          "aggregations.min_price.sum": 0.0,
          "hits.max_score": 0.0,
          "hits.total.relation": "eq",
          "hits.total.value": 3,
          "timed_out": false,
          "took": 2
        },
        "type": 3
      }
    ]
  }
}