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
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无法比拟的优势。