六十、Elasticsearch索引管理-深入探究type底层数
1、介绍
type,是一个index中用来区分类似的数据的,类似的数据,但是可能有不同的fields,而且有不同的属性来控制索引建立、分词器。
field的value,在底层的lucene中建立索引的时候,全部是opaque bytes类型(二进制类型),因为Lucene是没有type概念的,所以不区分类型。在document中,实际上将type作为一个document的field来存储,即_type,es通过_type来进行type的过滤和筛选。
一个index中的多个type实际上是放到一起存储的,所以一个index下不能有多个重名的type。
2、代码讲解
比如下面这个代码:
{
"ecommerce": {
"mappings": {
"elactronic_goods": {
"properties": {
"name": {
"type": "string",
},
"price": {
"type": "double"
},
"service_period": {
"type": "string"
}
}
},
"fresh_goods": {
"properties": {
"name": {
"type": "string",
},
"price": {
"type": "double"
},
"eat_period": {
"type": "string"
}
}
}
}
}
}
两个type对应的document如下:
{
"name": "geli kongtiao",
"price": 1999.0,
"service_period": "one year"
}
{
"name": "aozhou dalongxia",
"price": 199.0,
"eat_period": "one week"
}
但是在底层的存储却是下面这样
{
"ecommerce": {
"mappings": {
"_type": {
"type": "string",
"index": "not_analyzed"
},
"name": {
"type": "string"
}
"price": {
"type": "double"
}
"service_period": {
"type": "string"
}
"eat_period": {
"type": "string"
}
}
}
}
document是这样的:
{
"_type": "elactronic_goods",
"name": "geli kongtiao",
"price": 1999.0,
"service_period": "one year",
"eat_period": ""
}
{
"_type": "fresh_goods",
"name": "aozhou dalongxia",
"price": 199.0,
"service_period": "",
"eat_period": "one week"
}
可以看出如下知识点:
(1)实际上type是document中的一个字段_type,且类型是string,不进行分词
(2)底层会将当前index下所有type下的所有document的field都统一存放到了一个地方。对多个type的多个document进行了merge(合并)。
(3)doc1中没有eat_period字段,但是也会将他放入其内,只是value为空字符串,doc2同理。进一步证明了进行了merge。
(4)证明了同一个index下的不同type下的document字段名若相同,则类型一样要相同,否则会冲突,因为他在merge的时候不知道你这个字段是什么类型。
总结:将类似结构的type放在一个index下,这些type应该有多个field是相同的。假如说,你将两个type的field完全不同放到了一个index下,那么就每条数据都至少有一半的field在底层的Lucene中是空值,会有严重的性能问题
若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:
qrcode_for_gh_577b64e73701_258.jpg