SpringBoot+ElasticSearch+logstash学习笔记

目录

1.1.什么是ElasticSearch

1.2.ElasticSearch特点

1.3.Solr与Elasticsearch对比

2.ElasticSearch安装(服务端)

2.1.ElasticSearch部署与启动

2.2.ElasticSearch体系结构

3. elasticsearch-head 插件的安装与使用(客户端)

3.1.Head插件安装

3.2.Head插件操作

3.2.1.新建索引

3.2.2.新建或修改文档

3.2.3.搜索文档

3.2.4.删除文档

4.搜索微服务开发

4.1.整体业务逻辑分析图

4.2.logstash实现ElasticSearch与MySQL数据同步

4.3.spring-ElasticSearch

4.3.1.在pom.xml导入依赖

4.3.2.在application.yml添加配置

4.3.3编写启动类

4.3.4.编写实体映射

4.3.5编写ArticleController 

4.3.6ArticleService

4.3.7编写ArticleDao 

4.3.8浏览器测试


1.1.什么是ElasticSearch

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

1.2.ElasticSearch特点

1 )可以作为一个大型分布式集群(数百台服务器)技术,处理 PB 级数据,服务大公司;也可以运行在单机上
2 )将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的 ES
3 )开箱即用的,部署简单
4 )全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理
 

1.3.SolrElasticsearch对比

Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能 ;
Solr 支持更多格式的数据,而 Elasticsearch 仅支持 json 文件格式;
Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于Elasticsearch。
Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
 
 

2.ElasticSearch安装(服务端)

2.1.ElasticSearch部署与启动

下载 ElasticSearch5.6.8 版本
https://www.elastic.co/downloads/past-releases/elasticsearch-5-6-8
资源 \ 配套软件中也提供了安装包
无需安装,解压安装包后即可使用
在命令提示符下,进入 ElasticSearch 安装目录下的 bin 目录 ,执行命令elasticsearch后如下所示
 
SpringBoot+ElasticSearch+logstash学习笔记_第1张图片
 
我们打开浏览器,在地址栏输入 http://127.0.0.1:9200 即可看到输出结果
{
  "name" : "bG771C-",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "uUmLXXcGRCaFkHdaxtOyGQ",
  "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"
}

2.2.ElasticSearch体系结构

下表是 Elasticsearch MySQL 数据库逻辑结构概念的对比

SpringBoot+ElasticSearch+logstash学习笔记_第2张图片

3. elasticsearch-head 插件的安装与使用(客户端)

3.1.Head插件安装

如果都是通过rest请求的方式使用Elasticsearch,未免太过麻烦,而且也不够人性化。我们一般都会使用图形化界面来实现Elasticsearch的日常管理,最常用的就是Head插件。

步骤 1
下载 head 插件: https://github.com/mobz/elasticsearch-head
步骤 2
解压到任意目录,但是要和 elasticsearch 的安装目录区别开。
步骤 3
安装 nodejs, 安装 cnpm
npm install ‐g cnpm ‐‐registry=https://registry.npm.taobao.org
步骤 4
grunt 安装为全局命令。 Grunt 是基于 Node.js 的项目构建工具。它可以自动运行你所设定的任务
npm  install ‐ g   grunt‐cli
步骤 5 :安装依赖
cnpm install
步骤 6
进入 head 目录启动 head ,在命令提示符下输入命令
grunt server
SpringBoot+ElasticSearch+logstash学习笔记_第3张图片
 
步骤7:
打开浏览器,输入http://localhost:9100
步骤8:
点击连接按钮没有任何相应,按F12发现有如下错误
No'Access-Control-Allow-Origin'headerispresentontherequestedresource
这个错误是由于elasticsearch默认不允许跨域调用,而elasticsearch-head是属于前端
工程,所以报错。
 
我们这时需要修改elasticsearch的配置,让其允许跨域访问。
修改elasticsearch服务端配置文件:elasticsearch.yml,增加以下两句命令:
SpringBoot+ElasticSearch+logstash学习笔记_第4张图片
http.cors.enabled:true
http.cors.allow-origin:"*"

此步为允许elasticsearch跨越访问点击连接即可看到相关信息

SpringBoot+ElasticSearch+logstash学习笔记_第5张图片

3.2.Head插件操作

3.2.1.新建索引

选择“索引”选项卡,点击“新建索引”按钮:输入索引名称点击OK

3.2.2.新建或修改文档

在复合查询-查询中输入提交地址,输入内容http://localhost:9200/索引名/类型名/id,提交方式为PUT

{json中提交文档数据}

点击数据浏览,点击要查询的索引名称,右侧窗格中显示文档信息

3.2.3.搜索文档

点击数据浏览,点击title,输入收缩内容

3.2.4.删除文档

在复合查询-查询中输入提交地址,输入内容http://localhost:9200/索引名/类型名/id,提交方式为DELETE

 

4.搜索微服务开发

4.1.整体业务逻辑分析图

SpringBoot+ElasticSearch+logstash学习笔记_第6张图片

4.2.logstash实现ElasticSearchMySQL数据同步

logstash下载地址:https://www.elastic.co/cn/downloads/logstash

1 )在 logstash-5.6.8 安装目录下创建文件夹 mysqletc (名称随意)
2 )文件夹下创建 mysql.conf (名称随意) ,内容如下:
input {
  jdbc {
	  # mysql jdbc connection string to our backup databse
	  jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/tensquare_article?characterEncoding=UTF8&useSSL=true"
	  # 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:/logstash-5.6.8/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 => "10"
	#以下对应着要执行的 sql 的绝对路径。 
	#statement_filepath => "" 
	statement => "select * from tb_article"
	  #定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新(测试结果,不同的话请留言指出)
      schedule => "* * * * *"
  }
}

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

3)将 mysql 驱动包 mysql-connector-java-5.1.46.jar 拷贝至 D:/logstash-5.6.8/mysqletc/ 下 。

D:/logstash-5.6.8 是你的安装目录

4 )命令行下执行
logstash ‐f ../mysqletc/mysql.conf
 
再次刷新 elasticsearch-head 的数据显示,看是否也更新了数据. 更新说明mysql数据同步过来了。

 

4.3.spring-ElasticSearch

4.3.1.在pom.xml导入依赖


       org.springframework.data
       spring-data-elasticsearch

4.3.2.在application.yml添加配置

server:
  port: 9007
spring:
  application:
    name: tensquare-search
  data:
    elasticsearch:
      cluster-nodes: 127.0.0.1:9300

4.3.3编写启动类

package com.tensquare.search;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class SearchApplication {

    public static void main(String[] args) {

        SpringApplication.run(SearchApplication.class, args);
    }

}

4.3.4.编写实体映射

import org.springframework.data.elasticsearch.annotations.Document;

//此处表明elasticSearch的索引和类型,即对应mysql的数据库和表名
@Document(indexName = "tensquare",type = "article")
public class Article implements Serializable{
    ......
}

4.3.5编写ArticleController 

package com.tensquare.search.controller;
import com.tensquare.search.pojo.Article;
import com.tensquare.search.service.ArticleService;
import entity.PageResult;
import entity.Result;
import entity.StatusCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
/**
 * 文章controller
 */
@RestController
@RequestMapping("/article")
@CrossOrigin
public class ArticleController {
    @Autowired
    private ArticleService articleService;

    /**
     * 文章搜索
     */
    @RequestMapping(value = "/search/{keyword}/{page}/{size}",method = RequestMethod.GET)
    public Result search(@PathVariable String keyword,@PathVariable int page,@PathVariable int size){
        Page
pageData = articleService.search(keyword,page,size); return new Result(true, StatusCode.OK,"搜索成功",new PageResult<>(pageData.getTotalElements(),pageData.getContent())); } }

4.3.6ArticleService

package com.tensquare.search.service;

import com.tensquare.search.dao.ArticleDao;
import com.tensquare.search.pojo.Article;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

/**
 * 文章service
 */
@Service
public class ArticleService {

    @Autowired
    private ArticleDao articleDao;

    /**
     * 文章搜素
     */
    public Page
search(String keyword, int page, int size){ return articleDao.findByTitleOrContentLike(keyword,keyword, PageRequest.of(page-1,size)); } }

4.3.7编写ArticleDao 

继承ElasticsearchRepository接口

package com.tensquare.search.dao;

import com.tensquare.search.pojo.Article;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

/**
 * 文章dao
 */
public interface ArticleDao extends ElasticsearchRepository {

    /**
     * 文章查询
     */
    public Page
findByTitleOrContentLike(String title, String content, Pageable pageable); }

 

4.3.8浏览器测试

SpringBoot+ElasticSearch+logstash学习笔记_第7张图片

 

你可能感兴趣的:(Spring全家桶)