Elasticsearch 2.3 Geo Shape 类型映射
Elasticsearch 2.3 Geo Shape type mapping
我在 Elasticsearch 索引中有一个字段具有以下映射
"cluster_boundary": {
"type": "geo_shape",
"tree": "quadtree",
"precision": "1mm"
}
但是当我将此映射放入 elasticsearch 索引时,出现以下错误
java.lang.IllegalArgumentException: maxLevels of 36 exceeds limit of 29
at org.apache.lucene.spatial.prefix.tree.PackedQuadPrefixTree.<init>(PackedQuadPrefixTree.java:70)
at org.elasticsearch.index.mapper.geo.GeoShapeFieldMapper$GeoShapeFieldType.freeze(GeoShapeFieldMapper.java:276)
at org.elasticsearch.index.mapper.FieldMapper.<init>(FieldMapper.java:289)
at org.elasticsearch.index.mapper.geo.GeoShapeFieldMapper.<init>(GeoShapeFieldMapper.java:428)
at org.elasticsearch.index.mapper.geo.GeoShapeFieldMapper$Builder.build(GeoShapeFieldMapper.java:160)
at org.elasticsearch.index.mapper.geo.GeoShapeFieldMapper$Builder.build(GeoShapeFieldMapper.java:119)
at org.elasticsearch.index.mapper.object.ObjectMapper$Builder.build(ObjectMapper.java:167)
at org.elasticsearch.index.mapper.DocumentMapper$Builder.<init>(DocumentMapper.java:88)
at org.elasticsearch.index.mapper.MapperBuilders.doc(MapperBuilders.java:44)
at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:118)
at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:99)
at org.elasticsearch.index.mapper.MapperService.parse(MapperService.java:498)
at org.elasticsearch.cluster.metadata.MetaDataMappingService$PutMappingExecutor.applyRequest(MetaDataMappingService.java:257)
at org.elasticsearch.cluster.metadata.MetaDataMappingService$PutMappingExecutor.execute(MetaDataMappingService.java:230)
at org.elasticsearch.cluster.service.InternalClusterService.runTasksForExecutor(InternalClusterService.java:468)
at org.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:772)
at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:231)
at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:194)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
如果我将 quadtree
更改为 geohash
它 works.And,根据 elasticsearch,quadtree
中允许的最大树级别是 50
。
PackedQuadPrefixTree
的最高等级可能是 29,而 QuadPrefixTree
的最高等级是 50。您可以检查 here and here.
我浏览了 ES source code。 quadtree
映射到 lucene PackedQuadPrefixTree
所以你必须将精度值降低到 1m
转换为 26 tree_levels 或者你可以使用 legacyquadtree
最大 50级别。
我注意到的一件事是 ES 抛出 out of memory error
如果您使用 legacyquadtree
指定非常多的级别而不是说最大允许级别是 50。
PUT test_index/_mapping/test_type
{
"properties": {
"test": {
"type": "geo_shape",
"tree": "legacyquadtree",
"tree_levels": "54354552"
}
}
}
理想情况下上面的代码应该说最大级别是 50 但它用完了堆 space 并抛出 OOM 错误。
我也认为 1mm 太精确了,即使使用 leagcyquadtree 也会占用大量内存。 More on that. I have also opened an issue 在 github 上,你可以关注它。
我在 Elasticsearch 索引中有一个字段具有以下映射
"cluster_boundary": {
"type": "geo_shape",
"tree": "quadtree",
"precision": "1mm"
}
但是当我将此映射放入 elasticsearch 索引时,出现以下错误
java.lang.IllegalArgumentException: maxLevels of 36 exceeds limit of 29
at org.apache.lucene.spatial.prefix.tree.PackedQuadPrefixTree.<init>(PackedQuadPrefixTree.java:70)
at org.elasticsearch.index.mapper.geo.GeoShapeFieldMapper$GeoShapeFieldType.freeze(GeoShapeFieldMapper.java:276)
at org.elasticsearch.index.mapper.FieldMapper.<init>(FieldMapper.java:289)
at org.elasticsearch.index.mapper.geo.GeoShapeFieldMapper.<init>(GeoShapeFieldMapper.java:428)
at org.elasticsearch.index.mapper.geo.GeoShapeFieldMapper$Builder.build(GeoShapeFieldMapper.java:160)
at org.elasticsearch.index.mapper.geo.GeoShapeFieldMapper$Builder.build(GeoShapeFieldMapper.java:119)
at org.elasticsearch.index.mapper.object.ObjectMapper$Builder.build(ObjectMapper.java:167)
at org.elasticsearch.index.mapper.DocumentMapper$Builder.<init>(DocumentMapper.java:88)
at org.elasticsearch.index.mapper.MapperBuilders.doc(MapperBuilders.java:44)
at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:118)
at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:99)
at org.elasticsearch.index.mapper.MapperService.parse(MapperService.java:498)
at org.elasticsearch.cluster.metadata.MetaDataMappingService$PutMappingExecutor.applyRequest(MetaDataMappingService.java:257)
at org.elasticsearch.cluster.metadata.MetaDataMappingService$PutMappingExecutor.execute(MetaDataMappingService.java:230)
at org.elasticsearch.cluster.service.InternalClusterService.runTasksForExecutor(InternalClusterService.java:468)
at org.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:772)
at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:231)
at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:194)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
如果我将 quadtree
更改为 geohash
它 works.And,根据 elasticsearch,quadtree
中允许的最大树级别是 50
。
PackedQuadPrefixTree
的最高等级可能是 29,而 QuadPrefixTree
的最高等级是 50。您可以检查 here and here.
我浏览了 ES source code。 quadtree
映射到 lucene PackedQuadPrefixTree
所以你必须将精度值降低到 1m
转换为 26 tree_levels 或者你可以使用 legacyquadtree
最大 50级别。
我注意到的一件事是 ES 抛出 out of memory error
如果您使用 legacyquadtree
指定非常多的级别而不是说最大允许级别是 50。
PUT test_index/_mapping/test_type
{
"properties": {
"test": {
"type": "geo_shape",
"tree": "legacyquadtree",
"tree_levels": "54354552"
}
}
}
理想情况下上面的代码应该说最大级别是 50 但它用完了堆 space 并抛出 OOM 错误。
我也认为 1mm 太精确了,即使使用 leagcyquadtree 也会占用大量内存。 More on that. I have also opened an issue 在 github 上,你可以关注它。