惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
Microsoft Security Blog
Microsoft Security Blog
NISL@THU
NISL@THU
T
Threatpost
T
The Exploit Database - CXSecurity.com
T
Threat Research - Cisco Blogs
S
Securelist
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
人人都是产品经理
人人都是产品经理
B
Blog RSS Feed
S
Secure Thoughts
MyScale Blog
MyScale Blog
O
OpenAI News
P
Palo Alto Networks Blog
美团技术团队
C
Cyber Attacks, Cyber Crime and Cyber Security
TaoSecurity Blog
TaoSecurity Blog
量子位
L
Lohrmann on Cybersecurity
G
GRAHAM CLULEY
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tailwind CSS Blog
Know Your Adversary
Know Your Adversary
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Simon Willison's Weblog
Simon Willison's Weblog
宝玉的分享
宝玉的分享
PCI Perspectives
PCI Perspectives
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tenable Blog
I
InfoQ
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Microsoft Azure Blog
Microsoft Azure Blog
Recent Announcements
Recent Announcements
S
Security @ Cisco Blogs
S
Schneier on Security
B
Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
The Cloudflare Blog
AWS News Blog
AWS News Blog
IT之家
IT之家
V
Vulnerabilities – Threatpost
The Hacker News
The Hacker News
H
Heimdal Security Blog
I
Intezer
A
Arctic Wolf
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
H
Help Net Security
W
WeLiveSecurity

博客园 - 软件心理学工程师

SPIFFE/SPIRE 的身份哲学与技术实现 后量子密码学(post-quantum cryptography):为什么重要以及如何使用 密钥管理碎碎念 SpringBoot集成resilience4j进行熔断和一个响应式编程的问题 凤凰项目&DevOps实践指南 OAuth2和OpenID API横向越权问题的分析和解决 初识RAG 基于AWS的密钥管理系统 加密算法的使用场景 Linux透明大页(Transparent Huge Pages)对ES性能对影响 《java8 in action》读书笔记 初识redis Elasticsearch慢查询故障诊断 Elasticsearch搜索调优 elasticsearch基础知识杂记 elasticsearch.yml 常用参数说明 linux log rotate elasticsearch local debug环境搭建 CAP碎碎念 彻底删除kafka topic步骤
ES索引的一些长度限制
软件心理学工程师 · 2020-02-23 · via 博客园 - 软件心理学工程师

一个ES索引最大可以支持多少个shard?理论上无限扩展,我推测最大应该是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字段支持的最大keyword长度是32766个byte(这个是hard code的为ByteBlockPool的BYTE_BLOCK_SIZE-2),如果keyword字段存的是ES的Array, 则变为Array中的每term最大32766个byte,Array的最大size不受约束,但Array最大存储量是所有keyword总和为2147483647,可参考Lucene8.0.0的BytesRefHash的类注释。

这就引出来一个有趣的问题,ES type=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: cityName。通过debug addDocument方法,看到lucene会for循环所有的StringField并根据fieldName进行索引,相同fieldName会归为同一个PerField处理,最终每个BytesRef都会都会存到同一个BytesRefHash结构中,从而完成了数组(其实存的HashMap)的存储。同时不难推断,针对Array的term query耗时应该是寻址Hash碰撞链与Hash碰撞链上遍历到具体内容的时间之和,寻址hash链是O(1),hash链遍历是O(n),n是hash碰撞链的长度。这个长度又跟hash取模和Array size有关,lucene8.0.0默认的hash模是15,terms个数来自索引数据,Array size越大查询越耗时,好在不是线性增长而是log15n,size非常大时term query耗时并不会增长很多。

Reference:

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