首页 > 其他 > 详细

ES索引的一些长度限制

时间:2020-02-23 23:25:25      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:new   ger   query   clu   bsp   pin   

一个ES索引最大可以支持多个shards?理论上无限扩展,我猜测最大应该是java array的最大长度:Integer.MAX_VALUE。通常业务为了保证查询效率,往往会限制data node上shards的总个数(cluster.routing.allocation.total_shards_per_node)或者某个索引的shards个数(index.routing.allocation.total_shards_per_node)。

一个ES shard(lucene index)最多可以索引2,147,483,519个document。https://issues.apache.org/jira/browse/LUCENE-5843

一个ES mapping默认最多可以有1000个字段(index.mapping.total_fields.limit),因为ES DSL默认最多支持1000个search条件表达式(rewrite之后)。nest对象默认最多50个字段(index.mapping.nested_fields.limit),另外最多支持10000个nest对象(index.mapping.nested_objects.limit)。

一个ES keyword字段支持的最大长度是32766个byte(这个是hard code的可参见ByteBlockPool的BYTE_BLOCK_SIZE),如果keyword字段存的是Array, Array中的每一项最大限制是32766个byte,Array字段的最大size不受约束,但Array最大存储量应该也是所有keyword总和为2147483647,可参考Lucene的BytesRefHash

这就引出来一个有趣的问题,ES keyword字段,存Array和单个keyword的区别在哪里?

ES本身并不做底层的索引和存储而是lucene承担了这部分工作,通过lucene构造一个带有Array字段的document:

public static void indexDocument(IndexWriter writer) throws IOException {
List<String> cityNameList = new ArrayList();
cityNameList.add("BeiJing");
cityNameList.add("ShangHai");
cityNameList.add("HangZhou");

Document doc = new Document();
for(int i = 0; i<cityNameList.size();i++) {
doc.add(new StringField("cityName", new BytesRef(cityNameList.get(i)), Field.Store.YES));
}
long writerResult = writer.addDocument(doc);
System.out.println(writerResult);
}

可以看到是对一个document创建多个StringField,每个StringField都采用同样的fieldname。通过debug addDocument方法,看到lucene会for循环所有的StringField并根据fieldName进行索引,相同fieldName会归为同一个PerField处理,最终每个BytesRef都会都会存到一个BytesRefHash结构中,从而完成了数组(其实是HashMap)的存储。同时不难推断,针对Array中的某个keyword的term query的耗时应该是寻到Hash碰撞链与Hash碰撞链上遍历到具体内容的时间总和,寻址hash链是O(1),hash链遍历是O(n),n是hash链的长度。hash链的长度又跟hash取模和terms个数有关,lucene8.0.0默认的hash模是15。

 

Reference:

https://www.amazingkoala.com.cn/Lucene/gongjulei/2019/0218/32.html

 

ES索引的一些长度限制

标签:new   ger   query   clu   bsp   pin   

原文:https://www.cnblogs.com/zhq1007/p/12349075.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 bubuko.com 版权所有 鲁ICP备09046678号-4
打开技术之扣,分享程序人生!
             

鲁公网安备 37021202000002号