• ES解决geoip的location不为geo_point格式


    by: 铁乐猫

    date: 2020-01-08

    环境

    ELK各组件均为7.0版本

    出现问题的索引名称为tielemao_web_log*

    问题

    使用了geoip插件,入库的索引中location仍不是geo_point格式,以致想做地图经纬度的展示时做不了。

    原因:

    默认的log_template模板中没有任何匹配。

    解决办法

    新建索引模板,设置匹配成geo_point,且优先度调高。

    另外为防以后新项目入log重新碰到这个问题,将默认的log_template模板也加上geo_point的相关设置。

    默认索引模板添加geoip映射

    打开kibana的Dev Tools,本次操作索引模板在web界面下操作比较方便。

    log_template会默认就匹配上我们的索引:

    在kibana的Dev Tools里的Console中输入

    GET /_template/log_template

    点击三角形图标执行,右边会出现结果:

    {
      "log_template" : {
        "order" : 0,
        "index_patterns" : [
          "*log*"
        ],
        "settings" : {
          "index" : {
            "number_of_replicas" : "0"
          }
        },
        "mappings" : { },
        "aliases" : { }
      }
    }
    

    index_patterns中可以看到匹配索引名称中带log的:

    "index_patterns" : [
      "*log*"
    ],
    

    所以以防万一,在这个默认优先级0的模板中也加上:

    PUT /_template/log_template
    {
      "order" : 0,
      "index_patterns" : [
          "*log*"
      ],
      "settings" : {
        "index" : {
          "number_of_replicas" : "0"
        }
      },
      "mappings" : {
        "properties": {
          "client_ip": {
            "type": "ip"
          },
          "geoip": {
            "dynamic": true,
            "type": "object",
            "properties": {
              "location": {
                "type": "geo_point"
              }
            }
          }
        }
      },
      "aliases" : { }
    }
    

    这里主要是看:

    "mappings" : {
        "properties": {
          "client_ip": {
            "type": "ip"
          },
          "geoip": {
            "dynamic": true,
            "type": "object",
            "properties": {
              "location": {
                "type": "geo_point"
              }
            }
          }
        }
      },
    

    其中生效的是geoip的那一段,mappings的properties中添加了geoip这个字段,并且使用dynamic,允许Logstash的geoip插件将解析后的详细字段也保存到ES索引中。

    geoip插件解析出来会带有一个location字段,这个字段就是经纬度的坐标点,所以重点是这里要设置geoip.location字段的类型是geo_point。

    Geo-point表示为一个object,具有lat和lon两个key。

    改完可以GET再去看一下生效没有。

    新建匹配的索引模板

    我这里按照自己的情况新建了一个优先度为10且一定匹配得上的模板,例:

    PUT /_template/template_tielemao_weblog
    {
      "index_patterns" : [
          "tielemao_web_log*"
      ],
      "order" : 10,
      "mappings": {
        "properties": {
          "client_ip": {
            "type": "ip"
          },
          "geoip": {
            "dynamic": true,
            "type": "object",
            "properties": {
              "location": {
                "type": "geo_point"
              }
            }
          }
        }
      },
      "aliases" : {
          "tielemao_weblog" : { }
      }
    }
    

    其中匹配em_web_log*名字的索引,且order优先度为10,比默认的模板都高:

      "index_patterns" : [
          "em_web_log*"
      ], 
      "order" : 10,
    

    另外还起了个别名,方便以后零停机时间实现重新索引。

    效果

    新建完索引后,前面入库的索引及索引模式我都删除掉了,防止新索引模板不生效。

    删除后,等待新的索引生成,再在索引管理中查看,己经生效了:

    之后再在可视化中做展示就可以了,不会在选择Geohash的时候提示你没有geo_point,例:

    【End】

  • 相关阅读:
    AppiumDesktop控制手机和安卓模拟器
    Appium环境搭建超详细教程
    2022 杭电多校第一场
    Springcloud学习笔记48ApplicationRunner、CommandLineRunner接口使用
    java中23种设计模式

    Nacos
    Java常见的8种数据结构
    Java 对象模型(OOPKlass模型)
    nginx对skywalking grpc协议的负载nginx长连接和短连接概念
  • 原文地址:https://www.cnblogs.com/tielemao/p/13523564.html
Copyright © 2020-2023  润新知