目录html
索引模板: 就是把已经建立好的某个索引的参数设置(settings)和索引映射(mapping)保存下来做为模板, 在建立新索引时, 指定要使用的模板名, 就能够直接重用已经定义好的模板中的设置和映射.数据库
(1) settings: 指定index的配置信息, 好比分片数、副本数, tranlog同步条件、refresh策略等信息;json
(2) mappings: 指定index的内部构建信息, 主要有:app
①
_all
: All Field字段, 若是开启,_all
字段就会把全部字段的内容都包含进来,检索的时候能够不用指定字段查询 —— 会检索多个字段, 设置方式:"_all": {"enabled": true}
;elasticsearch在ES 6.0开始,
_all
字段被禁用了, 做为替换, 能够经过copy_to
自定义实现all字段的功能.ide②
_source
: Source Field字段, ES为每一个文档都保存一份源数据, 若是不开启, 也就是"_source": {"enabled": false}
, 查询的时候就只会返回文档的ID, 其余的文档内容须要经过Fields字段到索引中再次获取, 效率很低. 但若开启, 索引的体积会更大, 此时就能够经过Compress进行压缩, 并经过inclueds
、excludes
等方式在field上进行限制 —— 指定义容许哪些字段存储到_source
中, 哪些不存储;性能③
properties
: 最重要的配置, 是对索引结构和文档字段的设置.ui
索引模板通常用在时间序列相关的索引中.this
—— 也就是说, 若是你须要每间隔必定的时间就创建一次索引, 你只须要配置好索引模板, 之后就能够直接使用这个模板中的设置, 不用每次都设置settings和mappings.code
索引模板通常与索引别名一块儿使用. 关于索引别名, 后续研究以后再作补充.
建立一个商品的索引模板的示例:
(1) ES 6.0以前的版本:
PUT _template/shop_template { "template": "shop*", // 能够经过"shop*"来适配 "order": 0, // 模板的权重, 多个模板的时候优先匹配用, 值越大, 权重越高 "settings": { "number_of_shards": 1 // 分片数量, 能够定义其余配置项 }, "aliases": { "alias_1": {} // 索引对应的别名 }, "mappings": { "_default": { // 默认的配置, ES 6.0开始再也不支持 "_source": { "enabled": false }, // 是否保存字段的原始值 "_all": { "enabled": false }, // 禁用_all字段 "dynamic": "strict" // 只用定义的字段, 关闭默认的自动类型推断 }, "type1": { // 默认的文档类型设置为type1, ES 6.0开始只支持一种type, 因此这里不须要指出 */ "_source": {"enabled": false}, "properties": { // 字段的映射 "@timestamp": { // 具体的字段映射 "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }, "@version": { "doc_values": true, "index": "not_analyzed", // 不索引 "type": "string" // string类型 }, "logLevel": { "type": "long" } } } } }
(2) ES 6.0以后的版本:
PUT _template/shop_template { "index_patterns": ["shop*", "bar*"], // 能够经过"shop*"和"bar*"来适配, template字段已过时 "order": 0, // 模板的权重, 多个模板的时候优先匹配用, 值越大, 权重越高 "settings": { "number_of_shards": 1 // 分片数量, 能够定义其余配置项 }, "aliases": { "alias_1": {} // 索引对应的别名 }, "mappings": { // ES 6.0开始只支持一种type, 名称为“_doc” "_doc": { "_source": { // 是否保存字段的原始值 "enabled": false }, "properties": { // 字段的映射 "@timestamp": { // 具体的字段映射 "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }, "@version": { "doc_values": true, "index": "false", // 设置为false, 不索引 "type": "text" // text类型 }, "logLevel": { "type": "long" } } } } }
说明:
直接修改mapping的优先级 > 索引模板中的设置;
索引匹配了多个template, 当属性等配置出现不一致时, 以模板的权重(order属性的值)为准, 值越大越优先, order的默认值是0.
ES 6.0以后的版本API变化较大, 请重点关注.
(1) 查看示例:
GET _template // 查看全部模板 GET _template/temp* // 查看与通配符相匹配的模板 GET _template/temp1,temp2 // 查看多个模板 GET _template/shop_template // 查看指定模板
(2) 判断模板是否存在:
判断示例:
HEAD _template/shop_tem
结果说明:
a) 若是存在, 响应结果是:
200 - OK
b) 若是不存在, 响应结果是:
404 - Not Found
删除示例:
DELETE _template/shop_template // 删除上述建立的模板
若是模板不存在, 将抛出以下错误:
{ "error" : { "root_cause" : [ { "type" : "index_template_missing_exception", "reason" : "index_template [shop_temp] missing" } ], "type" : "index_template_missing_exception", "reason" : "index_template [shop_temp] missing" }, "status" : 404 }
—— Elasticsearch 6.X版本中已经不支持在同一个index下建立多个type.
6.X以前的版本中, 父子文档的实现是一个索引中定义多个type, 6.X中实现方式改变为join方式.
若是在同一个index下建立多个type, 会报出以下错误信息:
{ "error": { "root_cause": [ { "type": "illegal_argument_exception", "reason": "Rejecting mapping update to [book_shop] as the final mapping would have more than 1 type: [books, novel_book]" } ], "type": "illegal_argument_exception", "reason": "Rejecting mapping update to [book_shop] as the final mapping would have more than 1 type: [books, novel_book]" }, "status": 400 }
错误信息指出: 拒绝对[book_shop]的mapping信息进行修改, 由于它做为final mapping(终态的mapping), 将会有超过2个type.
若是咱们只关心查询的评分结果, 而不用查看原始文档的内容, 就设置"_source": {"enabled": false}
.
—— 这能节省磁盘空间并减小磁盘IO上的开销.
咱们能够把原始的数据存储在MySQL、HBase等数据库, 从ES中获得文档的ID以后, 再到相应的数据库中获取数据.
若是可以确切地知道要对哪一个field作查询操做, 就设置"_all": {"enabled": false}
.
—— 这能实现性能提高, 并节省存储空间.
而在6.X版本开始, _all
字段也再也不支持了, ES官方建议咱们经过copy_to
自定义咱们本身的all字段.
若是咱们的数据是结构化数据, 就设置"dynamic": "strict"
.
—— 把动态类型判断设置为严格, 也就是不容许ES为插入的数据进行动态类型设置, 避免注入脏数据.
若是咱们只关心精确匹配, 就设置test_field: {"type": "keyword"}
.
—— keyword类型要比text类型的性能更高, 而且还能节省磁盘的存储空间.
参考资料
版权声明
出处: 博客园 瘦风(https://www.cnblogs.com/shoufeng)
感谢阅读, 若是文章有帮助或启发到你, 点个[好文要顶👆] 或 [推荐👍] 吧😜
本文版权归博主全部, 欢迎转载, 但 [必须在文章页面明显位置标明原文连接], 不然博主保留追究相关人员法律责任的权利.