SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch

Elasticsearch是一个实时的分布式搜索分析引擎。它可以帮助你用前所未有的速 度去处理大规模数据。ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分 布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发 的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用 于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。 

RestApi和Head插件操作Elasticsearch使用非java方式操作 ,端口9200

SpringDataElasticsearch 采用java方式  端口9300

数据库同步: 通过logstash完成mysql与Elasticsearch同步工作


第一部分 Elasticsearch 

1.Elasticsearch与MySQL数据库逻辑结构概念的对比

Elasticsearch 关系型数据库Mysql
索引(index) 数据库(databases)
类型(type) 表(table)
文档(document) 行(row)

 

2.下载与启动 

下载ElasticSearch  5.6.8版本
  https://www.elastic.co/cn/downloads/past-releases/elasticsearch-5-6-8

启动: 在命令提示符下,进入ElasticSearch安装目录下的bin目录,执行命令
    elasticsearch
即可启动。
我们打开浏览器,在地址栏输入http://127.0.0.1:9200/  即可看到输出结果
elasticsearch

{
name: "zbKmjZZ",
cluster_name: "elasticsearch",
cluster_uuid: "W63nSobSRfKSLrrjuHXvzg",
version: {
number: "5.6.8",
build_hash: "688ecce",
build_date: "2018-02-16T16:46:30.010Z",
build_snapshot: false,
lucene_version: "6.6.1"
},
tagline: "You Know, for Search"
}

 

3.相关操作(Restful风格)

 a.创建索引库

postman以PUT方式请求 127.0.0.1:9200/tensquare_elasticsearch

{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "tensquare_elasticsearch"
}

b.创建文档

postman 以post方式请求  127.0.0.1:9200/tensquare_elasticsearch/article

{
    "_index": "tensquare_elasticsearch",
    "_type": "article",
    "_id": "AWjshO2_gWUztPUP5aDv",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "created": true
}

c.查询全部索引库索引 

GET方式提交 127.0.0.1:9200/tensquare_elasticsearch/article/_search

 

d.更新索引或者新建索引同方法

PUT方式提交

更新操作:127.0.0.1:9200/tensquare_elasticsearch/article/ + 已经存在的id   进行更新操作

新增操作:127.0.0.1:9200/tensquare_elasticsearch/article/ + 不存在的id   进行新增操作

 

e.根据id做查询  127.0.0.1:9200/tensquare_elasticsearch/article/1

  GET 条件查询  127.0.0.1:9200/tensquare_elasticsearch/article/_search?q=title:教程

                  127.0.0.1:9200/tensquare_elasticsearch/article/_search?q=content:项目   此处会有模糊查询

f.删除操作

DELETE 操作 127.0.0.1:9200/tensquare_elasticsearch/article/1

 

4.head插件(图形化界面)

步骤1:
下载head插件:https://github.com/mobz/elasticsearch-head  
配套资料中已提供。 elasticsearch-head-master.zip

步骤2:
解压到任意目录,但是要和elasticsearch的安装目录区别开。


步骤3:
安装node js  ,安装cnpm 
npm install ‐g cnpm ‐‐registry=https://registry.npm.taobao.org

步骤4:-- 这一步需要网络好的地方
将grunt安装为全局命令 。Grunt是基于Node.js的项目构建工具。它可以自动运行你所 设定的任务
 npm install ‐g grunt‐cli

 步骤5:安装依赖 需要在head-master对应的package.json文件同一级执行
cnpm install


步骤6:
进入head目录启动head,在命令提示符下输入命令

grunt server
 
步骤7: 打开浏览器,输入 http://localhost:9100


步骤8:
点击连接按钮没有任何相应,按F12发现有如下错误
No 'Access-Control-Allow-Origin' header is present on the requested resource
这个错误是由于elasticsearch默认不允许跨域调用,而elasticsearch-head是属于前端工 程,所以报错。
我们这时需要修改elasticsearch的配置,让其允许跨域访问。
修改elasticsearch配置文件:[D:\software\elasticsearch-5.6.8\config]

elasticsearch.yml,增加以下两句命令:

http.cors.enabled: true

http.cors.allow‐origin: "*"
此步为允许elasticsearch跨越访问     点击连接即可看到相关信息

head插件的使用

(1) 数据浏览为查询操作功能

     复合查询为增删改操作功能

SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第1张图片

(2)新增和更改操作: 获取索引,获取类型,然后在符合查询功能中进行操作

SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第2张图片

PUT操作进行更新和修改操作:拼接路径

SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第3张图片

 

5.ik分词器

(a)分词了解

http://127.0.0.1:9200/_analyze? analyzer=chinese&pretty=true&text=我是程序员

注:_analyze 分词   

       analyzer 分词器名称

(b)安装并重启elasticsearch    https://github.com/medcl/elasticsearch-analysis-ik/releases   下载5.6.8版 本

解压后放到该路径 D:\software\elasticsearch-5.6.8\plugins ,放到es路径的plugins目录下面

IK 提供了两个分词算法ik_smart ik_max_word

其中ik_smart为最少切分,ik_max_word为最细粒度划分

实例1:最少切分  ik_smart

http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&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
    }
  ]
}

实例2:最细粒度切分  ik_max_word

http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&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
    },
    {
      "token" : "程序",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "员",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "CN_CHAR",
      "position" : 4
    }
  ]
}

 (c)自定义词库 

向ik分词器中添加分词词条:秦时明月

步骤: 进入elasticsearch/plugins/ik/config 目录

           新建自定义dic文件  custom.dic,编辑内容

SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第4张图片

向custom.dic中添加词条,第一行需要设置空格,兼容各种环境

SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第5张图片

IKAnalyzer.cfg.xml添加自定义词条的目录

SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第6张图片

 重启 elasticsearch

127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=秦时明月


{
  "tokens" : [
    {
      "token" : "秦时明月",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "明月",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 1
    }
  ]
}

 

启动本地的es ,访问 http://localhost:9200/

启动本地的head插件 http://localhost:9100/

SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第7张图片


 

第二部分 SpringDataElasticsearch

一:初步了解

1.pom.xml引入依赖

       org.springframework.data

       spring‐data‐elasticsearch

 

2.application.xml

server:   
   port: 9007 
spring:   
   application:     
      name: tensquare‐search #指定服务名   
   data:     
      elasticsearch:
         cluster‐nodes: 127.0.0.1:9300

3.创建索引实体类

@Data
@EqualsAndHashCode(callSuper = false)
@Document(indexName = "tensquare_article",type = "article")
public class Article implements Serializable {

    @Id
    private Integer id;

    /**
     * 是否索引:就是看该域是否能被搜索
     * 是否分词:就表示搜索的时候是整体匹配还是单词匹配
     * 是否存储:就是是否在页面上显示
     */
    @Field(index = true, analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String title;

    @Field(index = true, analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String content;

    /**      审核状态 */
    private String state;

}

4.dao层依旧遵循

public interface ArticleDao extends ElasticsearchRepository {
}

5.索引的新增和查询

@RestController
@RequestMapping("/article")
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    @RequestMapping(method = RequestMethod.POST)
    public Result addArticle(@RequestBody Article article){
       articleService.save(article);
       return new Result(true,StatusCode.OK,"新建索引成功");
    }

    @RequestMapping(value = "/{key}/{page}/{size}",method = RequestMethod.GET)
    public Result findByTitleOrContent (@PathVariable String key,@PathVariable int page,@PathVariable int size) {
        Page
pageable = articleService.findByTitleOrContent(key,page,size); return new Result(true,StatusCode.OK,"查询成功",new PageResult
(pageable.getTotalElements(),pageable.getContent())); } }

第三部分  elasticsearch与MySQL数据同步 

一.什么是logstash

Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集 起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。

 

二.Windows:logstash同步数据到索引库中

1.解压logstash-5.6.8到 D:\software\logstash-5.6.8,拷贝mysqletc到D:\software\logstash-5.6.8

2.解压进入bin目录 logstash ‐e 'input { stdin { } } output { stdout {} }'

当前输入和输入无内容,后续会把数据库的内容输入到索引库,实现数据库和索引库的同步操作

SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第8张图片

3.mysql同步到es中步骤

 a.将mysqletc粘贴到该路径 D:\software\elasticsearch-5.6.8\mysqletc

 b.修改mysql.conf

input {
  jdbc {
	  # mysql jdbc connection string to our backup databse
	  jdbc_connection_string => "jdbc:mysql://192.168.1.105:3306/tensquare_article?characterEncoding=UTF8"
	  # the user we wish to excute our statement as
	  jdbc_user => "root"
	  jdbc_password => "123456"
	  # the path to our downloaded jdbc driver  
	  jdbc_driver_library => "D:\software\elasticsearch-5.6.8\mysqletc\mysql-connector-java-5.1.46.jar"
	  # the name of the driver class for mysql
	  jdbc_driver_class => "com.mysql.jdbc.Driver"
	  jdbc_paging_enabled => "true"
	  jdbc_page_size => "50"
	  #以下对应着要执行的sql的绝对路径。
	  #statement_filepath => ""
	  statement => "select id,title,content,state from tb_article"
	  #定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新(测试结果,不同的话请留言指出)
      schedule => "* * * * *"
  }
}

output {
  elasticsearch {
	  #ESIP地址与端口
	  hosts => "127.0.0.1:9200" 
	  #ES索引名称(自己定义的)
	  index => "tensquare_article"
	  #自增ID编号
	  document_id => "%{id}"
	  document_type => "article"
  }
  stdout {
      #以JSON格式输出
      codec => json_lines
  }
}

c.bin命令行下执行 logstash ‐f ../mysqletc/mysql.conf

执行时间间隔:一分钟一次,同步成功后会将mysql数据同步到索引库

input {
  jdbc {
	  # mysql jdbc connection string to our backup databse
	  jdbc_connection_string => "jdbc:mysql://192.168.1.105:3306/tensquare_article?characterEncoding=UTF8"
	  # the user we wish to excute our statement as
	  jdbc_user => "root"
	  jdbc_password => "123456"
	  # the path to our downloaded jdbc driver  
	  jdbc_driver_library => "D:/software/logstash-5.6.8/mysqletc/mysql-connector-java-5.1.46.jar"
	  # the name of the driver class for mysql
	  jdbc_driver_class => "com.mysql.jdbc.Driver"
	  jdbc_paging_enabled => "true"
	  jdbc_page_size => "50"
	  #以下对应着要执行的sql的绝对路径。
	  #statement_filepath => ""
	  statement => "select id,title,content,state from tb_article"
	  #定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新(测试结果,不同的话请留言指出)
      schedule => "* * * * *"
  }
}

output {
  elasticsearch {
	  #ESIP地址与端口
	  hosts => "127.0.0.1:9200" 
	  #ES索引名称(自己定义的)
	  index => "tensquare_article"
	  #自增ID编号
	  document_id => "%{id}"
	  document_type => "article"
  }
  stdout {
      #以JSON格式输出
      codec => json_lines
  }
}

注意:mysql删除数据后,索引库并不会消失,所以mysql需要维护state进行状态的同步,表示已删除

 

三.linux : logstash同步数据到索引库中

1.docker 安装elasticsearch

docker run -di --name=tensquare_elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:5.6.8

2.在postman先通过put提交请求 

192.168.1.105:9200/tensquare_article  生成一个tensquare_article索引库

 

3.通过本地请求 127.0.0.1/article  post请求,但是报如下错误:无法远程访问

{
    "timestamp": "2019-02-17T08:39:54.039+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "None of the configured nodes are available: [{#transport#-1}{nTimF_t5Q0O7PJwrbcPjiw}{192.168.1.105}{192.168.1.105:9300}]",
    "path": "/article"
}

解决方法:

a.进入容器

docker exec ‐it tensquare_elasticsearch /bin/bash 

b.拷贝配置文件到宿主机

docker cp  tensquare_elasticsearch:/usr/share/elasticsearch/config/elasticsearch.yml  /usr/share/elasticsearch.yml

c.关闭并删除原es容器

docker stop tensquare_elasticsearch     

docker rm  tensquare_elasticsearch

d.以配置文件启动

docker run -di --name=tensquare_es -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:5.6.8

e.)修改/usr/share/elasticsearch.yml   将 transport.host: 0.0.0.0 前的#去掉后保 存文件退出。其作用是允许任何ip地址访问elasticsearch  .开发测试阶段可以这么做,生产环境下指定具体的IP 

SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第9张图片

但是重启会报错,因为配置之后需要更多的软硬件

*** 系统调优

第一步:修改软硬件:修改/etc/security/limits.conf  ,追加内容

* soft nofile 65536  

* hard nofile 65536

第二步:修改访问数:nofile是单个进程允许打开的最大文件个数     soft nofile 是软限制  hard nofile是硬限制
修改/etc/sysctl.conf,追加内容

vm.max_map_count=655360

第三步:重新启动虚拟机,再次启动容器,发现已经可以启动并远程访问  

4.访问127.0.0.1:9007/article 添加

 SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第10张图片

查询全部

SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第11张图片

更新操作

SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第12张图片

四.linux :ik分词器

http://192.168.1.105:9200/_analyze?analyzer=chinese&pretty=true&text=我是程序员
http://192.168.1.105:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员
http://192.168.1.105:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序员

访问时

SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第13张图片

安装ik分词器

1.进入容器  docker exec -it tensquare_es /bin/bash,获取plugins路径  /usr/share/elasticsearch/plugins

2.拷贝ik到容器plugins中

docker cp ik.zip tensquare_es:/usr/share/elasticsearch/plugins/

3.重启es容器 

 

五.linux : 安装head插件,进行图形化界面展示

1.进入/usr/share,修改elasticsearch.xml

http.cors.enabled: true  

http.cors.allow‐origin: "*"

2.创建head容器

docker run ‐di ‐‐name=myhead ‐p 9100:9100 docker pull mobz/elasticsearchhead:5

3. 访问 192.168.1.105:9100

SpringCloud学习笔记(七)Elasticsearch与springDataElasticsearch_第14张图片

你可能感兴趣的:(微服务项目,springcloud微服务)