zoukankan      html  css  js  c++  java
  • 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/

     



     

     

  • 相关阅读:
    2017ccpc全国邀请赛(湖南湘潭) E. Partial Sum
    Codeforces Round #412 C. Success Rate (rated, Div. 2, base on VK Cup 2017 Round 3)
    2017 中国大学生程序设计竞赛 女生专场 Building Shops (hdu6024)
    51nod 1084 矩阵取数问题 V2
    Power收集
    红色的幻想乡
    Koishi Loves Segments
    Wood Processing
    整数对
    Room and Moor
  • 原文地址:https://www.cnblogs.com/zhuixun/p/13055865.html
Copyright © 2011-2022 走看看