• ElasticSearch 6.3.2 整合 Springboot 2.1.10.RELEASE 版本,使用 Logstash 导入 mysql 数据


     阅读完本文需要 5 分钟。”​

    最近因为项目需要使用到 Elasticsearch,故而去学了一下,在此记录一下。

    一、搭建基础环境和项目脚手架

    打开 https://www.elastic.co/ 官网,下载 elasticSearch-6.3.2.zip 压缩包,下载 kibana-6.3.2.zip 和 logstash-6.3.2.zip ,解压缩到一个 elk 的文件夹下。idea 使用 spring.start.io 来创建一个springboot 项目,注意 elasticsearch 和 springboot 版本对应的关系, 这里选择的是 Springboot 2.1.10.RELEASE,具体版本可以打开 https://mvnrepository.com/ 搜索 spring-boot-starter-data-elasticsearch 查看相关依赖,确定适合本机安装的 es 版本。

     

    二、关于 Elasticsearch 和 Kibana 以及 Logstash 基本介绍

    Elasticsearch 用于全文搜索,使用了基于 Restful 的 API 交互方式访问,它是一个文档数据库,可以对存储的每个字段进行索引,可以将 mysql 中的数据同步至 es 集群中进行分词处理,可以和 mysql 进行对比,

    最新版本 7.7 发生了一些变动:es7的java代码,只能使用 restclient。然后,个人综合了一下,对于 java 编程,建议采用 High-level-rest-client 的方式操作 ES 集群

    。官方 在 es7 删除 type,并且 es6 时已经规定每一个index只能有一个 type。在 es7 中使用默认的_doc作为 type,官方说在 8.x 版本会彻底移除 type。
    api 请求方式也发送变化,如获得某索引的某ID的文档:GET
    index/_doc/id 其中 index 和 id 为具体的值。

    es 的基本操作:

    1、前提是必须安装了相应版本  jdk, 启动 binelasticsearch.bat,linux 环境下 binelasticsearch,访问 localhost:9200 出现一串 json 字符串表示启动成功;

    2、启动完 elasticsearch 后 再启动 Kibana ,进入解压目录 .inkibana.bat , linux 下 .inkibana ,启动成功的话。浏览器中访问 localhost:5601 会出现操作界面,打开 dev-tools 页面,下面进行索引的操作都在该页面进行;

    2、索引的基本操作: 

    新建 IndexName 唯一,不然报错

    PUT /blog{}

     

    查询索引:

    GET _search

    {

      "query": {

        "match_all": {}

      }

    }

     

    条件查询:

    POST blog/_search

    {

      "query": {

        "bool": {

          "should": [

            {

              "match_phrase": {

                "problem_desp": " "

              }

            },

            {

              "match_phrase": {

                "cloud_id": "abcd"

              }

            }

          ]

        }

      }

    }

     

    删除索引慎操作会删除当前索引的所有数据(类似于 mysql 中 drop database 操作):

    DELETE /blog{}

     

    3、es 基本分词器 和 ik 分词器介绍

    分词器介绍:

    standard 支持中文,词汇单元转成小写形式,采用单字切分

    simple 非字母分词器去掉

    workspace 去掉空格不支持中文

    language 不支持中文

    POST _analyze

    {

      "analyzer": "standard",

      "text": "我是中国人"

    }

     

    返回结果:

    {

      "tokens": [

        {

          "token": "我",

          "start_offset": 1,

          "end_offset": 2,

          "type": "<IDEOGRAPHIC>",

          "position": 0

        },

        {

          "token": "是",

          "start_offset": 2,

          "end_offset": 3,

          "type": "<IDEOGRAPHIC>",

          "position": 1

        },

        {

          "token": "中",

          "start_offset": 3,

          "end_offset": 4,

          "type": "<IDEOGRAPHIC>",

          "position": 2

        },

        {

          "token": "国",

          "start_offset": 4,

          "end_offset": 5,

          "type": "<IDEOGRAPHIC>",

          "position": 3

        },

        {

          "token": "人",

          "start_offset": 5,

          "end_offset": 6,

          "type": "<IDEOGRAPHIC>",

          "position": 4

        }

      ]

    }

     

    它们对于中文的支持就好像一个老外讲中文的感觉,所以国内 es 大神开发了中文分词器 ik ,打开网址  https://github.com/medcl/elasticsearch-analysis-ik/releases 选择你的 es 版本和对应的文件格式,下载完成以后在 es 的压缩目录下 plugins 文件夹下新建 ik 文件夹然后将下载的文件解压出来全部复制到 ik 文件夹下,重启 es 使之生效;

    POST _analyze

    {

      "analyzer": "ik_smart",

      "text": "我是中国人"

    }

     


    结果很智能,我是中国人,分为三个词, 我、是、中国人

    {

      "tokens": [

        {

          "token": "我",

          "start_offset": 0,

          "end_offset": 1,

          "type": "CN_CHAR",

          "position": 0

        },

        {

          "token": "是",

          "start_offset": 1,

          "end_offset": 2,

          "type": "CN_CHAR",

          "position": 1

        },

        {

          "token": "中国人",

          "start_offset": 2,

          "end_offset": 5,

          "type": "CN_WORD",

          "position": 2

        }

      ]

    }

     


    或者使用 ik_max_word 

    POST _analyze

    {

      "analyzer": "ik_max_word",

      "text": "我是中国人"

    }

     

    查询结果和 ik_smart 对比一下:

    {

      "tokens": [

        {

          "token": "我",

          "start_offset": 0,

          "end_offset": 1,

          "type": "CN_CHAR",

          "position": 0

        },

        {

          "token": "是",

          "start_offset": 1,

          "end_offset": 2,

          "type": "CN_CHAR",

          "position": 1

        },

        {

          "token": "中国人",

          "start_offset": 2,

          "end_offset": 5,

          "type": "CN_WORD",

          "position": 2

        },

        {

          "token": "中国",

          "start_offset": 2,

          "end_offset": 4,

          "type": "CN_WORD",

          "position": 3

        },

        {

          "token": "国人",

          "start_offset": 3,

          "end_offset": 5,

          "type": "CN_WORD",

          "position": 4

        }

      ]

    }



    4、使用 Logstash 导入 mysql 数据到 es 中

    导入数据的到 es 中的中间件有很多, 阿里巴巴出的 canal 、还有其他 go-elasticsearch 中间件,这里使用的是官方出的 Logstash ,logstash 的作用相当于一个管道用于流通数据。由于是 mysql 数据库,进入 mysql 官网下载 jar 包,这里有个配置问题,关于 es 6.3.2 配置

    logstash.conf 文件 和最新版本 es-7.7.0,es-6.3.2 将下好的 jar 文件放入 es 安装目录下,而 es-7.7.0 则可以将 jar 文件放入 logstash-7.7.0logstash-corelibjars  目录下,相应的 logstash.conf 配置文件发生改变

    logstash-6.3.2 配置放在 bin 目录下:

    4.1、  全量

        一次性把数据全部导入到 elasticsearch 中,例如初始化

    4.2、  增量

    包括三个方面:

    • 插入数据
    • 原有数据更新
    • 原有数据删除

    input {

      jdbc {

        jdbc_connection_string => "jdbc:mysql://localhost:3306/demo"

    # The user we wish to execute our statement as

        jdbc_user => "root"

        jdbc_password => "123456"

    # The path to our downloaded jdbc driver

        jdbc_driver_library => "D:\elk\logstash-6.3.2\logstash-6.3.2\mysql-connector-java-5.1.47.jar"

        jdbc_driver_class => "com.mysql.jdbc.Driver"

    # our query

        statement => "select * from tb_article where create_date < NOW() order by create_date DESC;"

        }

      }

    output {

      stdout { codec => json_lines }

      elasticsearch {

    "hosts" => "localhost:9200"

    "index" => "blog"

      document_type => "_doc"

      document_id => "%{article_id}"

      }

    }

    前提是 jar 放入 logstash-7.7.0logstash-corelibjars  ,logstash-7.7.0  配置放在 bin 目录下:

    input {

      jdbc {

        jdbc_connection_string => "jdbc:mysql://localhost:3306/demo"

    # The user we wish to execute our statement as

        jdbc_user => "root"

        jdbc_password => "123456"

    # The path to our downloaded jdbc driver

        jdbc_driver_library => ""

        jdbc_driver_class => "com.mysql.jdbc.Driver"

    # our query

        statement => "select * from tb_article where create_date > :sql_last_value and create_date < NOW() order by create_date DESC;"

        }

      }

    output {

      stdout { codec => json_lines }

      elasticsearch {

    "hosts" => "localhost:9200"

    "index" => "blog"

      document_type => "_doc"

      document_id => "%{article_id}"

      }

    }

    最后进入 logstashin 目录执行,logstash -f logstash.conf ,如果配置正确会看到控制台打印出配置中的 sql 语句, sql 语句中的 :sql_last_value 指的是上次访问的数据,

    导入成功后在 dev-tools 执行如下命令

    GET /blog/_stats

    POST /blog/_search{}​

     

    三、es 集成 springboot 项目,项目地址 :https://github.com/blench/es_demo,具体代码不做过多解释,目前最新的 es-7.7 版本 springboot 还在更新不建议使用最新,项目中使用了 jpa 和 ElasticsearchRepository 来作为 mysql 和 es 访问,出现了几个小问题,

    一是 es 查询无数据:es 实体类配置,type ="_doc" 必须加上;

    二是 json 关于对象空值报错问题,加上 @JsonIgnore 或者 spring. jackson.serialization.fail-on-empty-beans = false

    三是 springboot-2.3.3 使用 jpa 会报错导致服务无法启动,目前上网找了原因是 hiberate 的问题还没有解决 todo,放弃高版本选择低版本稳定的 springboot 版本。

     

    spring:

        jackson:     

          date-format:  yyyy-MM-dd HH:mm:ss

            serialization:

              fail-on-empty-beans:  false

    @Document(indexName = "blog", type = "_doc", useServerConfiguration = true, createIndex = false)

     

    最后比较一下 es  和 mysql 的区别:

    ElasticSearch

    MySQL

    Index

    Database

    Type

    Table

    Document

    Row

    Field

    Column

    Mapping

    Schema

    Everything is indexed

    Index

    Query

    SQL

    GET http://…

    select * from …

    POST http://…

    update table set …

    关于 elk 基本的使用就到这里了, 更多有趣的 java 知识、面试经验、leetcode 刷题欢迎关注我的微信公众号

    参考资料:

    https://www.imooc.com/learn/1161

    https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html

    https://aijishu.com/a/1060000000015410

    http://stackoverflow.com/

     



     

     

  • 相关阅读:
    3.默认参数的注意事项
    2.关键字global,nonlocal
    1.函数的结构,调用,传参,形参,实参,args,kwargs,名称空间,高阶函数
    19. 实现一个整数加法计算器(多个数相加):
    20.文件操作
    18.使用for循环计算+1-3+5-7+9-11+13...99的结果
    ubuntu docker更新镜像源
    虚拟环境的使用
    前端基础之HTML
    jQuery基本使用
  • 原文地址:https://www.cnblogs.com/zhuixun/p/13055865.html
Copyright © 2020-2023  润新知