ES中一些特有的概念:

Elasticsearch是实时的分布式搜索分析引擎,内部使用Lucene做索引与搜索。Lucene是Java语言编写的全文搜索框架,用于处理纯文本的数据,但它只是一个库,提供建立索引、执行搜索等接口,但不包括分布式服务,这些正式ES做的。什么是全文?对全部的文本内容进行分析,建立索引,使之可以被搜索,因此成为全文。

分片(shard)是底层的基本读写单元,分片的目的是分割巨大的索引,让读写可以并行操作,有多台机器共同完成。

一个ES索引包含很多分片,一个分片是一个Lucene的索引,它本身就是一个完整的搜索引擎,可以独立执行建立索引和搜索任务。Lucene索引又由很多分段组成,每个分段都是一个倒排索引。ES每次“refresh”都会生成一个新的分段,其中包含若干文档的数据。在每个分段内部,文档的不通字段被单独建立索引。每个字段的值由若干词(Term)组成,Term是原文本内容经过分词器处理和语言处理后的最终结果。

分片数不够时,可以考虑新建索引,搜索1个有着50个分片的索引与搜索50个每个都有1个分片的索引完全等价,或者使用_split API来拆分索引。

删除的doc只在Lucene分段合并时才会真正从磁盘中删除。即使手工触发分段合并,任然会引起较高的I/O压力,并且可能因为分段巨大导致在合并过程中磁盘空间不足(分段大小大于磁盘可用空间的一半)。因此,我们建议周期性创建索引。当数据需要删除的时候,删除整个索引即可。

周期性创建新索引带来的一个新问题是集群整体分片数量较多,集群管理的总分片数越多压力就越大。在每天创建生成一个新索引的场景中,可能某天的数据量很小,实际上不需要这么多分片,甚至一个就够。这时,可以使用_shrink API来缩减主分片数量,降低集群负载。

技术上来说,一个主分片最大能够存储 Integer.MAX_VALUE - 128 个文档,但是实际最大值还需要参考你的使用场景:包括你使用的硬件, 文档的大小和复杂程度,索引和查询文档的方式以及你期望的响应时长。