ElasticSearch入门elasticsearch玩转大数据

六十、Elasticsearch索引管理-深入探究type底层数

2017-07-11  本文已影响97人  编程界的小学生

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
上一篇下一篇

猜你喜欢

热点阅读