2016-10-28 71 views
1

我在Elasticsearch索引字段与以下映射Elasticsearch 2.3地理形状类型映射

"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它的工作原理。并且,根据elasticsearch,quadtree中的最大允许树级别为50

回答

2

的最高水平可能PackedQuadPrefixTree是29而QuadPrefixTree是50.您可以检查herehere

我翻看了ES source codequadtree映射到lucene PackedQuadPrefixTree因此您必须将精度值降低到1m,这可以转化为26个树型级别,或者您可以使用最大为50级的legacyquadtree

有一两件事我注意到的是ES抛出out of memory error如果你指定,而不是说允许的最大水平非常高的数字与legacyquadtree水平为50

PUT test_index/_mapping/test_type 
{ 
    "properties": { 
    "test": { 
     "type": "geo_shape", 
     "tree": "legacyquadtree", 
     "tree_levels": "54354552" 
    } 
    } 
} 

理想上面的代码应该说最高等级是50,但它耗尽堆空间并抛出OOM错误。

我也认为1mm太精确了,即使有leagcyquadtree它也会占用大量的内存。 More就此。我也在github上打开了一个issue,你可以关注它。

+0

感谢您的回复。按照elasticsearch的文档'''quadtree'''最多有50个级别。根据你所说的文件似乎是错误的。我会尝试使用'''legacyquadtree'''。我已经尝试过'''1m'''的精度,而树的水平是'''33'''。 –