docker+springboot+elasticsearch可以集群+kibana+logstash(ELK)+IK中文分词的整合,以及报错问题

写在前:因为工作开发内容需要,需要用到搜索引擎同时又要用到分词,这个给我带来了很大的问题,百度了下最后选择了elk+ik这种。写本文的目的是整理总结下自己部署的过程和经验教训,小白都会遇到的坑,中间有一些自己的理解,若有大神希望批评指正共同进步!小弟不胜感激!!!

开始正文:springboot+elasticsearch+kibana+logstash(ELK)+IK中文分词的整合,以及报错问题 。

     前提先确定版本和环境(这个尤为重要,因为版本问题能搞死个人!!!

  我的环境是: docker +springboot2.1.5 +elasticsearch5.6.8+kibana5.6.8+logstash:5.6.8 +ik5.6.8,后面我会放上各版本配置,希望只做到从搭建到开发代码一条龙。

 

 

    docker 的安装我不多说了,直接从elasticsearch5.6.8 安装开始讲起,以下简称ES。

  第一步:安装ES

首先建好如下目录我们要从容器映射到宿主机上持久化的:

        config、data1(存放es单节点数据)、data2、data3、plugins(待会ik分词会映射到该目录下)

       

           

     config中的配置ES的配置信息我配置了三个节点,测试库上我就用了一个 所以我只讲es1的配置:

           

          es1.yml文件配置

cluster.name: elasticsearch-cluster
node.name: es-node1
network.bind_host: 0.0.0.0
network.publish_host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true 
node.data: true  
discovery.zen.ping.unicast.hosts: ["192.168.199.111:9300","192.168.199.111:9301","192.168.199.111:9302"]
discovery.zen.minimum_master_nodes: 1

es2.yml

 cluster.name: elasticsearch-cluster
node.name: es-node2
network.bind_host: 0.0.0.0
network.publish_host: 192.168.199.111
http.port: 9201
transport.tcp.port: 9301
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true 
node.data: true  
discovery.zen.ping.unicast.hosts: ["192.168.199.111:9300","192.168.199.111:9301","192.168.199.111:9302"]
discovery.zen.minimum_master_nodes: 2

es3.yml

  cluster.name: elasticsearch-cluster
node.name: es-node3
network.bind_host: 0.0.0.0
network.publish_host: 192.168.199.111
http.port: 9202
transport.tcp.port: 9302
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true 
node.data: true  
discovery.zen.ping.unicast.hosts: ["192.168.199.111:9300","192.168.199.111:9301","192.168.199.111:9302"]
discovery.zen.minimum_master_nodes: 2

network.publish_host: 0.0.0.0 为外网也能访问,如果不想可以指定本机ip

http.port :外部端口

transport.tcp.port: 内部端口

discovery.zen.ping.unicast.hosts:我配了三个节点 分别是9300、9301、9302 内部开放端口,对应外部端口是9200、9201、9202

discovery.zen.minimum_master_nodes:1  最少1个节点为一个集群 

node.master : true 主节点

node.data: true   节点也存储数据

跨域问题配置解决:

http.cors.enabled: true
http.cors.allow-origin: "*"   

暴露端口:不暴露访问可能会出错,在集群的时候,会发现不了节点,导致ES启动出错(docker logs -f  容器Id 查看报错信息)

[root@localhost  elasticsearch]# cd config/

[root@localhost config]# firewall-cmd --add-port=9300/tcp

success

[root@localhost config]# firewall-cmd --add-port=9301/tcp

success

[root@localhost config]# firewall-cmd --add-port=9302/tcp

success

 

同时更改配置:

宿主机中加入:

在/etc/sysctl.conf文件最后添加一行:

vm.max_map_count=262144

立即生效, 执行:

/sbin/sysctl -p

若没有安装vim

apt-get update

#安装VIM

apt-get install vim

 

可以参考此篇:https://www.cnblogs.com/jianxuanbing/p/9410800.html

 

ES的工作准备好后就是,docker拉镜像了,不要问我为什么用docker,问就是我懒

 docker pull elasticsearch:5.6.8        #拉取镜像 docker命令行

docker run -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d -p 9200:9200 -p 9300:9300 -v /home/zddts/es/elasticsearch/config/es1.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/zddts/es/elasticsearch/data1:/usr/share/elasticsearch/data -v /home/zddts/es/elasticsearch/plugins:/usr/share/elasticsearch/plugins --name ES01 elasticsearch:5.6.8

 

 

 ES_JAVA_OPTS 指定了ES的运行内存,已ES01 节点为例,二三节点如此安装

 -v  : 映射文件,持久保存数据,防止容器删了,配置数据gg

--name  容器名称随意

 查看容器启动了:

   docker ps -a  (docker ps 能查看启动的)

访问:

http://192.168.199.111:9200/     192.168.199.111是我测试机子ip 自行更正为自己的ip,安装成功

 

查看集群:

http://192.168.199.111:9200/_cat/nodes?pretty (就一个节点惊不惊喜意不意外?哈哈测试我只跑一个节点没必要跑三个)

 

 

第二安装kibana:

建文件夹目录yml配置都是给映射用的:

Kibana.yml 配置:

# Kibana is served by a back end server. This setting specifies the port to use.
server.port: 5601
server.host: "0.0.0.0"
server.name: "kibana"

# The URL of the Elasticsearch instance to use for all your queries.
elasticsearch.url: "http://192.168.199.111:9200"

 

server.port: 5601 kibana 的访问端口 

elasticsearch.url: 我是连接到 ES01 

 

拉取镜像 并且映射文件:

 

 docker run --name kibana -p 5601:5601 -v /home/zddts/es/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml:ro -d -e ELASTICSEARCH_URL=http://192.168.199.111:9200 kibana:5.6.8 

 

直接查看是否安装成功:

http://192.168.199.111:5601

 

第三安装logstash:(我依靠他来自动增量同步mysql 数据到ES上,已经删除的数据不太好处理,后面继续更新)

同样建好映射文件目录logstash,

    

docker pull docker.io/logstash:5.6.8

# 执行安装启动

docker run -u root --name logstash -d --privileged=true \ -p 5044:5044 \ -p 9600:9600 \

--log-driver json-file --log-opt max-size=50m \ -v /home/zddts/es/logstash/config:/usr/share/logstash/config \

-v /home/zddts/es/logstash/jars/mysql-connector-java-5.1.46.jar:/usr/share/logstash/logstash-core/lib/jars/mysql-connector-java-5.1.46.jar \

-v /home/zddts/es/logstash/log:/var/log/logstash/logstash-plain.log \ -e xpack.monitoring.elasticsearch.hosts=http://192.168.199.111:9200\ logstash:5.6.8 \ -f /usr/share/logstash/config/logstash-sample.conf

 

//logstash 安装运行后对服务器cpu 和磁盘都产生很大的压力,cpu调优 还没彻底解决

磁盘压力是由于运行 ,docker 中logstash容器日志以恐怖的方式增加瞬间写掉50g的磁盘 所以我加了

-log-driver json-file --log-opt max-size=50m    该内容限制了日志文件大小,

映射出来的文件: 

 

mysql-connector-java-5.1.46 是我用来连接数据库用来同步用的,请更具自己数据库版本自行选择合适的版本上传

配置logstash.yml文件

http.host: 0.0.0.0
xpack.monitoring.elasticsearch.hosts: http://192.168.199.111:9200

配置 logstash-sample.conf用来增量更新数据文件:

# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  jdbc {
    type => "patentBo"
    jdbc_driver_library => "/usr/share/logstash/logstash-core/lib/jars/mysql-connector-java-5.1.46.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://192.168.199.111:3306/zddts-patmarket"
    jdbc_user => "zddts-patmarket"
    jdbc_password => "***"
    schedule => "* * * * *"
    jdbc_default_timezone => "Asia/Shanghai"

#字段名称我都用驼峰格式,主要是我bo属性名就是驼峰格式,可以不需要转换就能直接映射值
    statement => "SELECT  a.pat_id   patId, a.pat_sort_id  patSortId, a.pat_sort_no  patSortNo, a.pat_sort_name  patSortName, a.pat_no  patNo, a.pat_title  patTitle, a.pat_img  patImg, a.pat_content  patContent, a.resource_type  resourceType, a.pat_type  patType, a.pat_belone  patBelone,
      a.legal_status  legalStatus, a.status  STATUS, a.sort_id  sortId, a.show_prc  showPrc, a.chg_log  chgLog, a.pat_end  patEnd, a.pay_endtime  payEndtime, a.recovery_end  recoveryEnd, a.raise_prc  raisePrc, a.proposed_prc  proposedPrc,
       a.reach_prc  reachPrc, a.commission_prc  commissionPrc, a.chg_fee  chgFee, a.year_fee  yearFee, a.overdue_fee  overdueFee, a.recovery_fee  recoveryFee, a.tax_fee  taxFee, a.bus_server_fee  busServerFee, a.manage_fee  manageFee,
       a.sale_org_no  saleOrgNo, a.sale_org_name  saleOrgName, a.sale_cons_id  saleConsId, a.sale_cons_name  saleConsName, a.pat_right  patRight, a.calced_flag  calcedFlag, a.calc_agree  calcAgree, a.sale_status  saleStatus,
       a.good_flag  goodFlag, a.top_flag  topFlag, a.rare_flag  rareFlag, a.hot_flag  hotFlag, a.top_order  topOrder, a.hits  hits, a.add_time  ADDTIME, a.end_time  endTime, a.up_time  upTime, a.remark  remark, b.pat_deatil_id  patDeatilId,
        b.patuse_code  patuseCode,  b.proposer  proposer,  b.inventor  inventor,  b.pro_time  proTime,  b.submit_time  submitTime,  b.bro_arch_name  broArchName,  b.prin_attor  prinAttor,  b.contact_name  contactName, b.contact_addr  contactAddr,
        b.contact_code  contactCode,   b.pub_annou_no  pubAnnouNo, b.pub_annou_time  pubAnnouTime, b.authorize_time  authorizeTime, b.obligee  obligee, b.publisher  publisher, b.tel_publisher  telPublisher, b.publisher_id   publisherId
FROM
  `pa_patent` a, `pa_pat_deatil` b 
WHERE a.pat_id = b.pat_id 
  AND a.pat_no = b.pat_no  "
    lowercase_column_names => false
    clean_run => "false"    # 是否清除last_run_metadata_path的记录,需要增量同步时此字段必须为false
  }
  
  jdbc {
    type => "patPayableBo"
    jdbc_driver_library => "/usr/share/logstash/logstash-core/lib/jars/mysql-connector-java-5.1.46.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://192.168.199.111:3306/zddts-patmarket"
    jdbc_user => "zddts-patmarket"
    jdbc_password => "******"#密码
    schedule => "* * * * *" #每分钟执行一次
    jdbc_default_timezone => "Asia/Shanghai"
    statement => "  SELECT id id,pat_no patNo ,STATUS  ,fee_type feeType,fee fee,pay_endtime payEndtime  FROM pat_payable "
    lowercase_column_names => false
    clean_run => "false"
  }
}
filter {
    json {
        source => "message"
        remove_field => ["message"]
    }
    # convert 字段类型转换,将字段xxx数据类型改为float;
    mutate {
        convert => {
            "xxx" => "float"
        }
    }
}
output{
    stdout {
        codec => json_lines
    }
    #elasticsearch{
    #    hosts => "192.168.199.111:9200" # ES连接
    #    index => "zddts-patmarket"      # ES索引名称
    #    document_type => "patentBo"
    #    document_id => "%{patId}"   # id对应ORACLE中主键字段
    #}
    
    if[type]=="patentBo"{
        elasticsearch {
          #ESIP地址与端口
          hosts => "192.168.199.111:9200"
          #ES索引名称(自己定义的)
          index => "zddts-patmarket"
          #文档类型
          document_type => "patentBo"
          #文档类型id
          document_id => "%{patId}"
      }
    }

    if[type]=="patPayableBo"{
        elasticsearch {
          #ESIP地址与端口
          hosts => "192.168.199.111:9200"
          #ES索引名称(自己定义的)
          index => "zddts-patmarket"
          #文档类型
          document_type => "patPayableBo"
          #文档类型id
          document_id => "%{id}"
      }
    }
}

第四步 安装管理ElasticSearch-Head:

 

docker pull mobz/elasticsearch-head:5

docker run -d --name es-head -p 9100:9100 mobz/elasticsearch-head:5

 

测试:http://192.168.199.111:9100/ 

访问:

 

第五步安装中文ik 分词器插件,这一步可以在ES安装好启动后操作

    版本比对:

  

docker exec -it ES01 /bin/bash

进入插件目录

cd plugins/

下载ik插件【注意版本问题】

wget http://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.8/elasticsearch-analysis-ik-5.6.8.zip

解压

unzip elasticsearch-analysis-ik-5.6.8.zip

删除压缩包

rm elasticsearch-analysis-ik-5.6.8.zip

退出容器

exit

 

安装好后 我就可以在映射的文件夹中看到,很方便,直接改这里的配置,重启容器就会生效这也是我映射文件的一个原因之一,方便,安全,不怕容器被删了

ok那我们测试下吧,java 代码 如何写可以参考:https://my.oschina.net/fusublog/blog/3050964

用restful 也可以访问: 我用的是postman来做测试,分词效果不错

 至此安装已经完成,那么接下来就是优化了:可能同学“上中真实个好东西”没有在返回结果中。跟我的不一样,哈哈那么接下来就是要说下ik 分词的 扩展了

   进入ik插件的配置目录我们可以看见:IKAnalyzer.cfg.xml和main.dic

这个IKAnalyzer.cfg.xml 是ik分词对热词的一个扩展,就是玩家开自定义自己的分词 ,在这个文件中配置,main.dic是自带的

截图中我配置了my.dic

 

并且正在IKAnalyzer.cfg.xml 引入改字典

重启ES01  

然后重新访问分词测试那么 你也会达到我一样的效果了。

ps: 某些单个字可能查询不到结果,但是词可以查到,我就是“装置” 能查到数据,“置”就查不到,就是没对“置”这个字维护索引建立热词

 配置好扩展热词,重启服务器就可以了。

更改模板 使用ik分词:  

PUT /_template/template_1

{

"template": "*",

"version": 50001,

"settings": {

"index.refresh_interval": "5s"

},

"mappings": {

"_default_": {

"_all": {

"enabled": true,

"norms": false

},

"dynamic_templates": [

{

"message_field": {

"path_match": "message",

"match_mapping_type": "string",

"mapping": {

"type": "text",

"norms": false

}

}

},

{

"string_fields": {

"match": "*",

"match_mapping_type": "string",

"mapping": {

"type": "text",

"norms": false,

"analyzer": "ik_max_word",

"fields": {

"keyword": {

"type": "keyword"

}

}

}

}

}

],

"properties": {

"@timestamp": {

"type": "date",

"include_in_all": false

},

"@version": {

"type": "keyword",

"include_in_all": false

}

}

}

}

}

 

 

 

 

延伸问题:这样我每次维护热词是不是都要起服务,感觉这样完全不是我们程序员可以忍受的了,应该是我可以在数据库维护热词,然后这边可以热部署我的分词,这样就是完美了。(20191120改,配置远端扩展)

 

关于这个问题有兴趣的同学、大哥大姐可以参考:

https://www.liangzl.com/get-article-detail-9284.html 文章十分的话 我给11分,绝对通俗易懂。

ps:以上配置安装好后,可以做成自己独立镜像,我是直接做成镜像的就像自己做个jdk,(其他镜像完全满足不了我这个巨婴的需求) 那么下次在生产上就直接拉取镜像就好了,可以跳过这些重复步骤,只要改过配置就行。努力学习中,知识从群众中来加工消化后到群众中去,持续更新中。。。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Elasticsearch 简介 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。elasticSearch 的使用场景 1、在海量数据前提下,对数据进行检索。比如:京东,淘宝等电商项目课程目标: 1. 了解企业级搜索引擎2. 安装elasticsearch 课程目录: 01 课程介绍02 elasticsearch 简介03 elasticsearch 使用场景04 安装elasticsearch 之前先安装jdk05 安装elasticsearch06 测试elasticsearch是否安装成功 07 安装kibana08 elasticsearch 基本认识 以及添加索引和删除索引09 elasticsearch 添加查询数据10 elasticsearch 修改删除数据11 elasticsearch 有条件的查询12 分词子属性fuzzy查询13 elasticsearch 过滤使用14 elasticsearch 排序与分页15 elasticsearch 如何查询指定的字段16 elasticsearch 高亮显示17 elasticsearch 聚合18 elasticsearch mapping 概念19 elasticsearch中文词库20 elasticsearch 中文词库安装测试21 elasticsearch 中文词库的使用案例22 elasticsearch 自定义词库配置23 安装nginx 配置中文词库24 测试elasticsearch 自定义中文词库25 搭建项目父工程26 搭建项目bean-interface-common27 搭建search 的service web 项目28 测试项目是否能与elasticsearch联通29 创建数据库并搭建首页30 数据上传功能的实现类完成31 数据上传控制器完成32 dubbo 介绍以及安装zookeeper33 将数据从mysql 上传到elasticsearch 中34 elasticsearch查询功能分析35 编写业务需求的dsl 语句36 编写输入参数返回结果集的实体类37 实现类编写38 编写实现类中dsl 语句39 返回集结果转换40 结果测试41 测试通过输入查询条件并将数据显示到页面

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

boomLJIE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值