将带有json列的mysql数据导入弹性搜索

时间:2018-06-12 12:40:16

标签: python mysql json elasticsearch logstash

我在MySQL中有一个列,其中一个列中包含json,我必须使用多个键在此列上实现搜索。我尝试使用log stash使用Mysql创建索引。

这是我的日志存储配置。 Info是文本形式的文本和json对的列

input {
  jdbc {
    jdbc_connection_string => "jdbc:mysql://localhost:3306/dbname"
    # The user we wish to execute our statement as
    jdbc_user => "user"
    jdbc_password => "password"
    # The path to our downloaded jdbc driver
    jdbc_driver_library => "/usr/share/java/mysql-connector-java-5.1.38.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    # our query
    statement => "SELECT info FROM organization"
    }
  }
output {
  stdout { codec => json_lines }
  elasticsearch {
  "hosts" => "localhost:9200"
  "index" => "new_index"
  "document_type" => "doc"
  }
}

我尝试创建索引的映射并将其中一个字段设置为嵌套在映射中,但没有任何内容上传到我的索引。从MySQL到索引的原始更新将我的json视为文本,这使搜索更加困难。 任何人都有更好的解决方案将json列更新为索引,以便我可以从密钥中搜索。

输出

{
  "check_index" : {
    "aliases" : { },
    "mappings" : {
      "doc" : {
        "properties" : {
          "@timestamp" : {
            "type" : "date"
          },
          "@version" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "info" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1528870439037",
        "number_of_shards" : "5",
        "number_of_replicas" : "1",
        "uuid" : "MkNrBMD8S8GYfDtxRyOFfg",
        "version" : {
          "created" : "6020499"
        },
        "provided_name" : "check_index"
      }
    }
  }
}

有信息是我的JSON字符串。在其下面我有许多关键值,例如:json中的地址,名称等,所以我没有为这个字段创建一个json,而是在列中添加了json。但我无法搜索那个json。

1 个答案:

答案 0 :(得分:1)

我认为您要找的是JSON filter。只需在JSON过滤器中添加JSON类型的列名称即可。我们假设数据类型为JSON的列是info,您的过滤器将如下所示。

filter {
  json {
    source => "info"
    }
}

如果您有多个JSON数据类型的列,则可以在json内重复filter dict。因此,对于JSONinfo,您的最终logstash配置将如下所示。

input {
  jdbc {
      jdbc_connection_string => "jdbc:mysql://localhost:3306/dbname"
      # The user we wish to execute our statement as
      jdbc_user => "user"
      jdbc_password => "password"
      # The path to our downloaded jdbc driver
      jdbc_driver_library => "/usr/share/java/mysql-connector-java-5.1.38.jar"
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      # our query
      statement => "SELECT info FROM organization"
  }
} 
filter {
  json {
    source => "info"
    }
}
output {
  elasticsearch {
  "hosts" => "localhost:9200"
  "index" => "new_index"
  "document_type" => "doc"
  }
}