2016-10-28 8 views
1

私は、次のマッピングElasticsearch 2.3ジオシェイプ型マッピング

"cluster_boundary": { 
     "type": "geo_shape", 
     "tree": "quadtree", 
     "precision": "1mm" 
    } 

でElasticsearchインデックスのフィールドを持っていますが、私は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) 

の場合私はquadtreegeohashに変更します。elasticsearchごとにquadtreeの最大許容ツリーレベルは50です。

答えて

2

PackedQuadPrefixTreeの可能な最大レベルは29です。QuadPrefixTreeは50です。herehereを確認できます。

私はES source codeを見ました。 quadtreeはlucene PackedQuadPrefixTreeにマッピングされているため、精度値を1mに下げる必要があります。これは26のtree_levelsに変換されるか、legacyquadtreeには最大50レベルが使用できます。

私が気づいた一つのことは、あなたがlegacyquadtreeとのレベルの非常に高い数を指定するのではなく、最大許容レベルは、理想的には、コード上で50

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

であると言っては最大レベルが50であると言うべきかどうESはout of memory errorをスローですが、それヒープ領域がなくなり、OOMエラーがスローされます。

私はまた、1mmがあまりにも精密であり、リーガサイクトツリーでさえ、多くのメモリを取ると思います。それにはMore。私はまたあなたが従うことができるgithubにissueを開いた。

+0

返信いただきありがとうございます。 elasticsearchドキュメントによると '' quadtree'''は最大50レベルです。あなたが言うことに基づいて、ドキュメントは間違っているようです。 '' legacyquadtree'''を使って試してみましょう。私は「1m」の精度を試しており、ツリーレベルは「33」です。 –

関連する問題