2016-10-28 10 views
1

У меня есть поле в индексе Elasticsearch с последующим отображениемElasticsearch 2,3 Geo тип формы отображения

"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. Вы можете проверить, что here и here.

Я просмотрел ES source code. quadtree карты для lucene PackedQuadPrefixTree, поэтому вам нужно снизить значение точности до 1m, что соответствует 26 уровням дерева или вы можете использовать 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, но заканчивается из кучного пространства и выдает ошибку OOM.

Я также считаю, что 1 мм слишком точен и даже с leagcyquadtree потребуется много памяти. More сверху это. Я также открыл issue на github, за которым вы могли следовать.

+0

Спасибо за ответ. Согласно документации elasticsearch '' 'quadtree''' имеет максимум 50 уровней. На основании того, что вы говорите, документация кажется неправильной. Я попробую использовать '' 'legacyquadtree'''. Я пробовал точность '' '1m''', а уровень дерева' '' 33'''. –