• elasticsearch 之mapping


    搭好elk 后,有时候会发现kibana 统计数据时,数据类型不对,这个时候就和elasticsearch的mapping有关,虽然我们可以用logstash修改传入es里的数据类型,比如 float 或者int 或者string。但是没有double等类型,就算转换了,你会发现写入es的数据还是根据es里mapping表来定义的。接下来我们来学习修改es的mapping,当然mapping的功能有很多种,比如定义索引是否分词,分片和副本的数量是多少等等。

    1) 什么是mapping

    ES的mapping非常类似于静态语言中的数据类型:声明一个变量为int类型的变量, 以后这个变量都只能存储int类型的数据。同样的, 一个number类型的mapping字段只能存储number类型的数据。

    同语言的数据类型相比,mapping还有一些其他的含义,mapping不仅告诉ES一个field中是什么类型的值, 它还告诉ES如何索引数据以及数据是否能被搜索到。

    当你的查询没有返回相应的数据, 你的mapping很有可能有问题。当你拿不准的时候, 直接检查你的mapping。

    2) 剖析mapping

    一个mapping由一个或多个analyzer组成, 一个analyzer又由一个或多个filter组成的。当ES索引文档的时候,它把字段中的内容传递给相应的analyzer,analyzer再传递给各自的filters。

    filter的功能很容易理解:一个filter就是一个转换数据的方法, 输入一个字符串,这个方法返回另一个字符串,比如一个将字符串转为小写的方法就是一个filter很好的例子。

    一个analyzer由一组顺序排列的filter组成,执行分析的过程就是按顺序一个filter一个filter依次调用, ES存储和索引最后得到的结果。

    总结来说, mapping的作用就是执行一系列的指令将输入的数据转成可搜索的索引项。

     

    3)实战转换mapping数据类型

    我们使用logstash 传入一个索引,这个时候这个索引加载的为默认mapping,如下

    {

    • "parking_total": {
      • "mappings": {
        • "parking_total": {
          • "properties": {
            • "@timestamp": {
              • "type": "date",
              • "format": "strict_date_optional_time||epoch_millis"
              },
            • "@version": {
              • "type": "string"
              },
            • "active": {
              • "type": "string"
              },
            • "host": {
              • "type": "string"
              },
            • "kafka": {
              • "properties": {
                • "consumer_group": {
                  • "type": "string"
                  },
                • "msg_size": {
                  • "type": "long"
                  },
                • "offset": {
                  • "type": "long"
                  },
                • "partition": {
                  • "type": "long"
                  },
                • "topic": {
                  • "type": "string"
                  }
                }
              },
            • "logdate": {
              • "type": "string"
              },
            • "message": {
              • "type": "string"
              },
            • "path": {
              • "type": "string"
              },
            • "total": {
              • "type": "string"
              },
            • "type": {
              • "type": "string"
              }
            }
          }
        }
      }

    }

    其中我们就是要修改 total 和 active 这2个字段,修改mapping时需要将索引全部删除。这里我们来操作一下

     

     

    接下来,我们先创建这个索引的mapping 因为索引没有的时候,mapping也可以存在,其实是删除索引的时候mapping 不会跟着删除的,当然创建的时候,如果有的字段没有定义,mapping 会自动按照默认来定义。

     {  "mappings":
              {
            "parking_total" : {  
                "properties" : {  
                    "@timestamp" : {  
                        "type" : "date"  
                    },  
                    "message" : {  
                        "type" : "string"  
                    },  
                    "total" : {  
                        "type" : "double"  
                    },  
                     "active" : {  
                        "type" : "double"  
                    }
                }  
            }  
        }  
     }

    这样在重新导入数据,就成功啦。

                                                      by:V

     

  • 相关阅读:
    Java实现 LeetCode 735 行星碰撞(栈)
    Java实现 LeetCode 735 行星碰撞(栈)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 蓝桥杯算法提高 求最大值
    Java实现 蓝桥杯算法提高 求最大值
    Java实现 蓝桥杯算法提高 求最大值
    Python eval() 函数
    Python repr() 函数
  • 原文地址:https://www.cnblogs.com/shiyiwen/p/6150373.html
Copyright © 2020-2023  润新知