美文网首页ElasticSearch入门elasticsearch玩转大数据
六十、Elasticsearch索引管理-深入探究type底层数

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

作者: 编程界的小学生 | 来源:发表于2017-07-11 21:27 被阅读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

    相关文章

      网友评论

        本文标题:六十、Elasticsearch索引管理-深入探究type底层数

        本文链接:https://www.haomeiwen.com/subject/wvtvhxtx.html