Twitter 边界框的 Elasticsearch 索引未被识别为 geo_shape

Elasticsearch indexing of Twitter bounding box not recognized as a geo_shape

我正在尝试为 Twitter 的 Place geo bounding_box 数组创建一个 Elasticsearch 映射,但我无法让 Elasticsearch 将其索引为地理边界框。在我的应用程序中,我将从 Twitter4j 获取原始 JSON,但是边界框不会关闭边界框,因此出于此测试的目的,我编辑了 json 并将其关闭。我正在使用弹性云 (ES v5) 和其他 API,然后使用 Kibana 进行可视化。

这是我正在尝试使用的映射。我已经尝试了几种有和没有 "properties" 块的变体,但它不起作用。使用此映射,我可以成功地放置映射,但是当我 POST 文档时,Kibana 将该数组识别为未知字段类型。

点坐标字段被索引为地理点就好了,但边界框没有。

这是我的映射:

PUT /testgeo

{
    "mappings": {
        "tweet": {
            "_all": {
                "enabled": false
            },
            "properties": {
                "created_at": {
                    "type": "date",
                    "format": "EEE MMM dd HH:mm:ss Z YYYY||strict_date_optional_time||epoch_millis"
                },
                "coordinates": {
                    "properties": {
                        "coordinates": {
                            "type": "geo_point",
                            "ignore_malformed": true
                        }
                    }
                },
                "place": {
                    "properties": {
                        "bounding_box": {
                            "type": "geo_shape",
                            "tree": "quadtree",
                            "precision": "1m"
                        }
                    }
                }
            }
        }
    }
}

这是我尝试 POST 的文档片段(注意:我手动添加了第 5 个数组元素以关闭边界框)。

POST /testgeo/tweet/1

{
    ...
    "coordinates": {
        "type": "point",
        "coordinates": [
            0.78055556,
            51.97222222
        ]
    },
    "place": {
        "id": "0c31a1a5b970086e",
        "url": "https:\/\/api.twitter.com\/1.1\/geo\/id\/0c31a1a5b970086e.json",
        "place_type": "city",
        "name": "Bures",
        "full_name": "Bures, England",
        "country_code": "GB",
        "country": "United Kingdom",
        "bounding_box": {
            "type": "polygon",
            "coordinates": [
                [
                    [
                        0.773779,
                        51.96971
                    ],
                    [
                        0.773779,
                        51.976437
                    ],
                    [
                        0.781794,
                        51.976437
                    ],
                    [
                        0.781794,
                        51.96971
                    ],
                    [
                        0.773779,
                        51.96971
                    ]
                ]
            ]
        },
        "attributes": {
        }
    },

如果有人能找出原因并加以纠正,我将不胜感激。

注意 1::我尝试使用 Elastic geo_shape 文档页面中的映射和文档示例,Kibana 再次将位置字段显示为未知类型。

PUT /testgeo

{
    "mappings": {
        "tweet": {
            "_all": {
                "enabled": false
            },
            "properties": {
                "location": {
                    "type": "geo_shape",
                    "tree": "quadtree",
                    "precision": "1m"
                }
            }
        }
    }
}

POST /testgeo/tweet/1

{
    "location" : {
        "type" : "polygon",
        "coordinates" : [
            [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
        ]
    }
}

事实证明,Kibana 确实反映了 GeoShape 的类型。然而,在执行地理查询时,Elasticsearch returns 正确的结果。

例如:

  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "geo_shape": {
          "place.bounding_box": {
            "shape": {
              "type": "polygon",
              "coordinates": [
                [
                    [
                        0.773779,
                        51.96971
                    ],
                    [
                        0.773779,
                        51.976437
                    ],
                    [
                        0.781794,
                        51.976437
                    ],
                    [
                        0.781794,
                        51.96971
                    ],
                    [
                        0.773779,
                        51.96971
                    ]
                ]
              ]
            },
            "relation": "within"
          }
        }
      }
    }
  }
}

尽管您似乎已经找到了解决问题的方法,但我只想说现在可以通过在 geo_shape 的映射中使用 coerce 选项来解决此问题,就像这样:

"properties": {
    "bounding_box": {
        "type": "geo_shape",
        "tree": "quadtree",
        "precision": "1m",
        "coerce": true
    }
}

另见: https://github.com/elastic/elasticsearch/pull/11161