本文主要对ES索引的映射、路由规则、别名、滚动索引进行整理和介绍。
1、映射
ES是通过索引映射来建立索引结构,索引映射相当于数据库的数据字典,定义了每个字段的名称以及所能保存的数据类型。
索引的映射创建后,后续还可以在映射上添加新字段,但是旧的字段无法删除和修改。
对于映射所能支持的常规数据类型,这里我就举两个例子:
- 文本类型(text):支持分词的字段类型,默认情况下,ES会使用标准分词器将文本切分,并将切分后的文本保存到索引中。
- 关键字类型(keyword):与文本类型不同,关键字类型的字段不需要进行分词处理,保存的是原始文本。当我们要做精确查询的时候字段必须是keyword类型。
忽略映射中不合法的数据,即写入数据如果不符合映射的定义,不会影响其他字段的写入,例如:一个字段的类型是时间类型,但是将"aaa"写入该字段,虽然该字段无法成功写入,但是也不会影响到其他字段的写入。
我们可以通过在映射中为某个字段定义copt_to参数,以实现将该字段复制到另外一个字段上,即「字段复制」。通过这种方式,我们可以实现一个查询条件对应多个字段查询的情况。如下图:
通过上图,我们可以看到title、author、abstract三个字段copt_to到了full_text。这样我们就可以实现只查询full_text字段就可以达到分别查询title、author、abstract三个字段的效果。
需要注意的是这里的full_text字段并不属于_source元数据,即它不是构建搜索的原始文本,例如上边的例子,构建索引的时候需要提供tilte、author、abstract者三个字段,而无需提供full_text。
默认情况下,只有_source元数据中的字段才会被保存到磁盘上,如果有需要将full_text字段也保存到磁盘上,我们可以通过在映射的时候将full_text字段的store属性设置为true,如下图:
ES支持动态映射,即写入索引的数据可以包含之前未定义的字段,ES会根据数据的内容自动匹配数据类型。匹配的规则除了默认之外,还支持自定义。
2、路由规则
ES通过路由规则来确定索引数据到底写入到哪个分片上。默认情况下,ES会使用下图这个公式来计算数据要写入的分片的编号:
3、别名
我们可以通过一个别名指向多个索引,这样搜索的时候使用别名就能同时搜索到多个索引的数据。
别名配合数据过滤,即可以给别名设置数据过滤条件,这样通过别名查询的时候就会自带查询条件,达到自动过滤数据的效果。
别名配合路由,即可以给别名设置路由,这样读写别名的时候就会自动携带路由信息。
4、滚动索引
当索引的数据量太大的时候,如果再往索引中写入数据会造成分片容量过大,会导致查询的时候内存不够引起整个集群的崩溃。这个时候我们可以考虑通过滚动索引 将数据写入到别的索引上,滚动索引需要与索引别名配合使用(可以理解是基于别名却创建一个滚动索引)。
假设有个名为log_idx_0的索引,它别名为log_idx_all。然后为别名log_idx_all指定一个滚动索引,如下图:
触发创建滚动索引需要符合一定的条件。
如果符合条件,则会创建一个新的索引,例如:log_idx_1,此时会将索引log_idx_0从别名log_idx_all中删除,并将别名log_idx_all指向log_idx_1。以后再通过别名log_idx_all写数据,数据会被写入到索引log_idx_1中。
如果不符合条件,则不会创建新的索引log_idx_1,数据依然会写入到索引log_idx_0中。
ES是不会自动的去检查当前索引是否符合触发滚动索引的条件了,我们只能采用手动的去轮询调用_rollover端点,并通返回结果来进行判断(索引是否符合触发滚动索引条件了、是否成功创建新的索引了)。
5、参考文献
- 《Elasticsearch数据搜索与分析实战》------王深湛