- 公司开展电商业务,之前有开发过类似项目,并没有涉及首页搜索功能,这次鉴于首页所搜需求变动,不仅仅是搜索商品,还要搜索店铺,直播及主播,现有实现方式是直接搜索数据库,为了增加用户体验,减小数据库的压力,so改用Elasticsearch实现首页搜索功能。
Elasticsearch安装
- 准备elasticsearch安装包,版本选择7.6.0; 官网地址 ;
- 使用root用户创建es用户
useradd es
然后为es用户设置密码
passwd es
- 修改/etc/security/limits.conf文件 在文件末尾添加
* hard nofile 65536
* soft nofile 65536
- 修改/etc/security/limits.d/20-nproc.conf文件
* soft nproc 4096
* hard nproc 4096
root soft nproc unlimited
在/etc/sysctl.conf文件末尾添加
vm.max_map_count = 2621441
root用户执行命令
sudo sysctl -p /etc/sysctl.conf
切换用户
su es
上传elasticsearch-7.6.0-linux-x86_64.tar.gz文件至es用户目录下
解压到当前目录
tar -zxvf elasticsearch-7.6.0-linux-x86_64.tar.gz
修改/home/es/elasticsearch-7.6.0/config/elasticsearch.yml配置文件
#这里写本机ip,
network.host: 192.168.110.191
#
# Set a custom port for HTTP:
#
#http.port: 9200
#跨域配置 网页直连使用需要该配置,否则不需要
http.cors.enabled: true
http.cors.allow-origin: "*"
安装
elasticsearch-analysis-ik中文分词器;在/home/es/elasticsearch-7.6.0/config/目录下创建analysis-ik目录
cd /home/es/elasticsearch-7.6.0/config/
mkdir analysis-ik
将下载下来的中文分词器文件解压,并将config目录下的所有文件拷贝到/home/es/elasticsearch-7.6.0/config/analysis-ik目录下
在/home/es/elasticsearch-7.6.0/plugins目录下创建analysis-ik目录
cd /home/es/elasticsearch-7.6.0/plugins
mkdir analysis-ik
将分词器中除config之外的文件拷贝到/home/es/elasticsearch-7.6.0/plugins/analysis-ik目录下
启动elasticsearch服务
cd /home/es/elasticsearch-7.6.0/bin
./elasticsearch -d
浏览器访问
http://192.168.110.191:9200/出现如下页面则服务启动成功
{
"name" : "eshost",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "muEaR2aHT6uT_F1lop84Lg",
"version" : {
"number" : "7.6.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "7f634e9f44834fbc12724506cc1da681b0c3b1e3",
"build_date" : "2020-02-06T00:09:00.449973Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
数据同步工具
Logstash;注意:一定要保证版本一致
cd /home/es/
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.6.0.zip
unzip logstash-7.6.0.zip
cd logstash-7.6.0
mkdir myconfig
cd myconfig
在此目录下需要创建mysql.conf文件以及要执行的sql文件,以及数据库驱动jar包,示例(此示例为多表同步):
-rw-rw-r--. 1 es es 23 Jun 22 14:08 commodity.sql
-rw-rw-r--. 1 es es 24 Jun 23 10:35 instructor.sql
-rw-rw-r--. 1 es es 18 Jun 23 10:36 live.sql
-rw-rw-r--. 1 es es 4658 Jun 23 10:50 mysql.conf
-rw-rw-r--. 1 es es 2018353 May 28 11:25 mysql-connector-java-8.0.9-rc.jar
-rw-rw-r--. 1 es es 24 Jun 23 10:36 user_store.sql
sql文件中的内容为
select * from commodity
mysql.conf文件中的内容为
input {
stdin {
}
jdbc {
# mysql数据库连接
jdbc_connection_string => "jdbc:mysql://192.168.110.191:3306/platform?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false"
# mysqly用户名和密码
jdbc_user => "xxx"
jdbc_password => "xxxx"
# 驱动配置
jdbc_driver_library => "/home/es/logstash-7.6.0/myconfig/mysql-connector-java-8.0.9-rc.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
# 执行指定的sql文件
statement_filepath => "/home/es/logstash-7.6.0/myconfig/commodity.sql"
# 设置监听 各字段含义 分 时 天 月 年 ,默认全部为*代表含义:每分钟都更新
schedule => "* * * * *"
# 索引类型
type => "commodity"
}
jdbc {
# mysql数据库连接
jdbc_connection_string => "jdbc:mysql://192.168.110.191:3306/platform?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false"
# mysqly用户名和密码
jdbc_user => "xxxx"
jdbc_password => "xxxx"
# 驱动配置
jdbc_driver_library => "/home/es/logstash-7.6.0/myconfig/mysql-connector-java-8.0.9-rc.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
# 执行指定的sql文件
statement_filepath => "/home/es/logstash-7.6.0/myconfig/instructor.sql"
# 设置监听 各字段含义 分 时 天 月 年 ,默认全部为*代表含义:每分钟都更新
schedule => "* * * * *"
# 索引类型
type => "instructor"
}
jdbc {
# mysql数据库连接
jdbc_connection_string => "jdbc:mysql://192.168.110.191:3306/platform?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false"
# mysqly用户名和密码
jdbc_user => "xxxx"
jdbc_password => "xxxx"
# 驱动配置
jdbc_driver_library => "/home/es/logstash-7.6.0/myconfig/mysql-connector-java-8.0.9-rc.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
# 执行指定的sql文件
statement_filepath => "/home/es/logstash-7.6.0/myconfig/live.sql"
# 设置监听 各字段含义 分 时 天 月 年 ,默认全部为*代表含义:每分钟都更新
schedule => "* * * * *"
# 索引类型
type => "live"
}
jdbc {
# mysql数据库连接
jdbc_connection_string => "jdbc:mysql://192.168.110.191:3306/platform?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false"
# mysqly用户名和密码
jdbc_user => "xxxx"
jdbc_password => "xxxx"
# 驱动配置
jdbc_driver_library => "/home/es/logstash-7.6.0/myconfig/mysql-connector-java-8.0.9-rc.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
# 执行指定的sql文件
statement_filepath => "/home/es/logstash-7.6.0/myconfig/user_store.sql"
# 设置监听 各字段含义 分 时 天 月 年 ,默认全部为*代表含义:每分钟都更新
schedule => "* * * * *"
# 索引类型
type => "user_store"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
if [type]=="user_store" {
elasticsearch {
#ESIP地址与端口
hosts => "192.168.110.191:9200"
#ES索引名称(自己定义的)
index => "user_store"
#自增ID编号
#document_id => "%{id}"
}
}
if [type]=="live" {
elasticsearch {
#ESIP地址与端口
hosts => "192.168.110.191:9200"
#ES索引名称(自己定义的)
index => "live"
#自增ID编号
#document_id => "%{id}"
}
}
if [type]=="instructor" {
elasticsearch {
#ESIP地址与端口
hosts => "192.168.110.191:9200"
#ES索引名称(自己定义的)
index => "instructor"
#自增ID编号
#document_id => "%{id}"
}
}
if [type]=="commodity" {
elasticsearch {
#ESIP地址与端口
hosts => "192.168.110.191:9200"
#ES索引名称(自己定义的)
index => "commodity"
#自增ID编号
#document_id => "%{id}"
}
}
}
启动Logstash
cd /home/es/logstash-7.6.0/bin
./logstash -f ../myconfig/mysql.conf &
完