地理处理 Elasticsearch 的强大功能用于为大量应用程序提供功能。 但是,它有一个限制:它仅适用于世界坐标。使用 point 和 shape 类型,X-Pack 将地理功能扩展到每个二维平面坐标系。此用例的常见场景包括映射和记录建筑物坐标以及检查文档是否在形状内。
在我之前的文章 “Elasticsearch:如何制作 GeoJSON 文件并进行地理位置搜索”,我展示了如何制作 GeoJSON 并对地理位置进行搜索。在今天的文章中,我将使用另外一种方法来展示地理位置搜索。更多搜索,请参阅 “Elasticsearch:使用 Elasticsearch 进行地理位置搜索”。
我们想使用 Elasticsearch 在我们的商店中映射设备的坐标。 为此,请按照以下步骤操作:
1) 要创建用于存储设备及其位置的索引,我们将使用以下映射:
- PUT test-point
- {
- "mappings": {
- "properties": {
- "device": {
- "type": "keyword"
- },
- "location": {
- "type": "point"
- }
- }
- }
- }
2)现在,我们可以存储一些包含我们设备数据的文档:
- PUT test-point/_bulk
- {"index":{"_index":"test-point","_id":"1"}}
- {"device":"device1","location":{"x":10,"y":10}}
- {"index":{"_index":"test-point","_id":"2"}}
- {"device":"device2","location":{"x":10,"y":15}}
- {"index":{"_index":"test-point","_id":"3"}}
- {"device":"device3","location":{"x":15,"y":10}}
此时,我们想在我们的商店中创建形状,以便我们可以将其分成几部分并检查人员/设备是否在定义的形状内。 为此,请按照下列步骤操作:
1)首先,让我们创建一个索引来存储我们的形状:
- PUT test-shape
- {
- "mappings": {
- "properties": {
- "room": {
- "type": "keyword"
- },
- "geometry": {
- "type": "shape"
- }
- }
- }
- }
2)现在,我们可以存储一个文档来测试映射:
- POST test-shape/_doc/1
- {
- "room": "hall",
- "geometry": {
- "type": "polygon",
- "coordinates": [
- [ [8.0, 8.0], [8.0, 12.0], [12.0, 12.0], [12.0,8.0], [8.0, 8.0] ]
- ]
- }
- }
3)现在,让我们以我们存储的形状搜索我们的设备:
- POST test-point/_search
- {
- "query": {
- "shape": {
- "location": {
- "indexed_shape": {
- "index": "test-shape",
- "id": "1",
- "path": "geometry"
- }
- }
- }
- }
- }
这个相当如下的搜索:
在上图中,A->B->C->D->A 这个形状是我们的 shape,而 E,F,G 三个点是在索引 test-point 里定义的三个文档所处的位置。显然针对上面的 test-point 的搜索,只有 E 点在 shape 之内。上面的搜索的好处是,我们可以随时更改 test-shape 里的形状而使用同样的一个搜索来进行。它可以关联两个索引。
Point 和 shape 类型用于管理文档中每种类型的二维平面坐标系。 它们的用法类似于 geo_point 和 geo_shape。
在 Elasticsearch 中存储形状的优势在于,你可以简化匹配坐标和形状之间约束的方式。 这在我们的查询示例中得到了展示,我们从 test-shape 索引加载了形状的几何图形,并从 test-point 索引进行搜索。我们可以使用不同 shape 来对同样一个 point 索引来进行不同的搜索。
管理坐标系和形状是一个非常大的话题,需要了解形状类型和地理模型,因为它们与数据模型密切相关。