springboot+elasticsearch+ik+logstash实现搜索功能(elasticsearch数据库用于查询,mysql数据库用于修改数据,logstash用于同步数据,ik做分词)

0.0 架构说明

0.1、各软件作用说明
0.1.1、elasticsearch(ik时elasticsearch的插件,作用是做分词)

elasticsearch是一种搜索引擎,也是一种数据库,总的来讲是一种有很强搜索功能的数据库。可以布置集群,用于很大数据的查询。
我这里把他作为mysql数据库的副本,采用logstash将mysql的数据同步到elasticsearch中。

0.2.2、logstash用于将数据从mysql同步到elasticsearch
0.2、其他说明

我打算以后增,删,改操作通过mysql数据进行。
查询操作去查询elasticsearch“数据库”。
因为mysql有什么变更,都会自动同步到elasticsearch中。

1.0、软件准备

软件版本(想搭建成功最好选择和我一样的版本,版本不一致bug一大堆。)

单个elasticsearch安装直接解压就可以运行,这里不做多说,我只讲集群安装。

下载压缩包解压密码:steamfish

elasticsearch-7.4.2

ik-7.4.2

logstash-7.4.2

2.1、elasticsearch分布式安装

2.1.1、解压以后修改配置文件/config/elasticsearch.yml
#配置集群
cluster.name: es-01     #指定集群名称
node.name: node-1       #指定节点名称
http.port: 9201         #指定节点端口
#集群发现配置
network.host: 0.0.0.0
discovery.seed_hosts: ["127.0.0.1","127.0.0.1","127.0.0.1",]    #指定节点ip
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
discovery.zen.ping_timeout: 120s
#允许跨域请求
http.cors.enabled: true
http.cors.allow-origin: "*"
2.1.2、安装ik

将ik解压以后放到/plugins/目录下,结构为/plugins/ik/**

2.1.3、启动

然后启动/bin/elasticsearch.bat即可

2.2、安装logstash

2.2.1、安装mysql驱动

解压以后将mysql-connector-java-8.0.18.jar放到目录/logstash-core/lib/jars下面

2.2.2、创建jdbc.conf和jdbc.sql放在更目录下/jdbc.conf和/jdbc.sql

jdbc.conf

input {
  jdbc {
    jdbc_connection_string => "jdbc:mysql://localhost:3306/steamed_fish_auction?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai"
	jdbc_user => "root"
	jdbc_password => "gsf19980101"
	#jdbc_driver_library => "./mysql/mysql-connector-java-8.0.16.jar"
	jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
	jdbc_paging_enabled => true
	jdbc_page_size => "5000"
	jdbc_default_timezone => "Asia/Shanghai"
	
	
	#执行sql语句
	statement_filepath => "D:/BlankExceptionProgress/logstash/logstash-7.4.2/jdbc.sql"
	#statement_filepath => "D:\BlankExceptionProgress\logstash-7.11.2\jdbc.sql"
	#定时字段,每隔一分钟更新一次
	schedule => "* * * * *"

	
	#禁止转换小写
	lowercase_column_names => false
	
  }
}

#filter {
#对数据进行处理,actorList 在elasticsearch的mappings是数组,数据库中是字符串,所以要进行切割
#  ruby {
#    code => "
#		array1 = event.get('actorList').split(',')
#		event.set('actorList', array1)
#	"
#  }
#}

output {
  elasticsearch {
    hosts => ["http://127.0.0.1:9201"]
    index => "steamed_fish_auction"
	document_type => "auction_item"
	document_id => "%{id}"      #将id的值赋给_id
	# 如果elasticsearch存在mappings,则不需要这两条命令
	#template_overwrite => true
    #template => "./mysql/template.json"
  }
  
  #输出调试,正式环境注释 
  stdout {
      codec => json_lines
  } 
}

jdbc.sql

SELECT
	id,
	name,
	description,
	deleted
FROM
	auction_item

3.2.3、启动:使用命令

./bin/logstash -f jdbc.conf -t    #检查配置文件是否出错
./bin/logstash -f jdbc.conf       #启动logstash,之后每个1分钟,从mysql更新一次数据到elasticsearch

2.3、springboot整合elasticsearch

2.3.1、引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <version>2.2.4.RELEASE</version>
</dependency>
2.3.2、配置ElasticSearch客户端ElasticSearchClientConfig.java
package com.steamedfish.auctionitemserver.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ElasticSearchClientConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("127.0.0.1", 9201, "http"))  //指定客户端ip和端口
        );

        return restHighLevelClient;
    }

}
2.3.3、从elasticsearch查询数据:查询description里面带生活的所有记录
//IndexCoordinates.of("steamed_fish_auction")获取索引定位
NativeSearchQuery query = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.matchQuery("description", "生活"))
                .build();

        SearchHits<AuctionItemModel> searchHits = elasticsearchRestTemplate.search(query, AuctionItemModel.class,IndexCoordinates.of("steamed_fish_auction"));
        searchHits.getSearchHits().forEach(System.out::println);
2.3.4、关于搜索的一些说明

个人建议查询数据从elasticsearch,操作数据操作mysql。如此高并发量的查询和其他操作分开。不仅减轻了mysql的压力,而且使用elasticsearch做查询本身就有mysql无法比拟的优势。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值