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
}
}
我正在尝试为 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
}
}