1. 前言
最近我参与开发的系统在做重构的工作,这个系统之前一直存在着一个问题(被用户吐槽了很久😂),用户负责的订单筛选排序查询慢,数据同步慢(有时候得半小时才能同步订单数据)。我自己亲自在APP上体验了一下,确实很难受。分析了一下,造成这种问题的原因有两个:
1. 订单数据是从数据库从库中查询出来的。
- 为什么要从从库查询呢?
因为这部分用户只需要对订单进行跟单,也就是说没有写操作- 为什么从库的数据同步慢呢?
2. 查询订单的时候,负责的筛选条件以及排序条件导致表的索引难以命中。
基于以上原因:所以在重构的时候,架构师就给了建议,说可以考虑使用Elastisearch来解决复杂的筛选和排序条件造成订单查询慢的问题,同时数据同步的问题可以通过Kafka+Elasticsearch来解决。这个解决方案听起来还不错,但是在开始技术评审之前,我需要先做一下技术预演(就是做个DEMO),看看Elasticsearch是否可行,就这样我就开始慢慢地踩入ES的坑了。
补充一下:目前我们公司还没有一套现成的搜索引擎解决方案,要是有,我就不要踩这么多坑了😭,考虑到公司迟早会用到,所以就派我先行探路了。
2. 安装并启动
2.1 版本选择
由于重构的工作是基于新的工程,而新的工程使用的是SpringBoot1.5.X的版本,应该选择Elasticsearch小于5.0,大于2.0版本,参照下图:
选择好版本后,可以到ES官网下载对应的版本 点击此处
我选择的是ES2.3.0版本
2.2 安装ES
- 将压缩包上传到服务器
- 在服务器中解压
$ tar -zxf elasticsearch-2.3.0.tar.gz
- 解压后,将elasticsearch-2.3.0移动到/usr/local目录下,然后进入elasticsearch-2.3.0文件夹
$ mv elasticsearch /usr/local/
$ mv cd elasticsearch-2.3.0/
- 进入config目录,对elasticsearch.yml(可以跳过使用默认值)
$ cd config/
$ vim elasticsearch.yml
# 可以进行如下配置(不配置的话会有默认值)
cluster.name: rodde-es-application # 设置集群的名称
node.name: node-1 # 设置集群中节点的名称(一个ES实例就是一个节点)
path.data: /path/to/data # 设置数据存储的路径
path.logs: /path/to/logs # 设置日志存储的路径
network.host: 0.0.0.0 # 设置ES绑定的IP,
http.port: 9200 # 设置HTTP的端口
transport.tcp.port: 9300 # 设置TCP通信端口
注:将network.host配置为0.0.0.0是为了解决ES启动后不能访问通过IP:9200的问题
- 进入bin目录,修改elasticsearch文件配置
$ cd ../bin/
$ vim elasticsearch
# 添加配置
ES_JAVA_OPTS="-Des.insecure.allow.root=true"
注:出于安全性考虑,root用户启动elasticsearch会报以下错误,需要添加上述配置
Exception in thread "main" Java.lang.RuntimeException: don't run elasticsearch as root.
2.3启动ES
Elasticsearch有两种启动方式:
- 前台运行:日志会显示在界面上,占用一个终端
$ ./elasticsearch #启动后想要停止,直接ctrl+c即可
- 后台运行(推荐使用)
$ ./elasticsearch -d
# 后台方式启动的话,想要停止ES,需要执行以下命令
$ ps aux | grep elastic # 查询当前ES的进程
$ kill -9 16046 # 删除对应的进程号
示例
2.4 验证
在浏览器上访问http://{ip}:9200,看到如下返回的数据,即表示ES启动成功
{
"name": "node-1",
"cluster_name": "rodde-es-application",
"version": {
"number": "2.3.0",
"build_hash": "8371be8d5fe5df7fb9c0516c474d77b9feddd888",
"build_timestamp": "2016-03-29T07:54:48Z",
"build_snapshot": false,
"lucene_version": "5.5.0"
},
"tagline": "You Know, for Search"
}
3. 安装Head插件
Head插件是Elasticsearch的一个可视化管理插件,可以方便地查看,删除,管理数据
注:不要在生产环境安装Head插件,进入这个插件是不需要密码的,要是别人知道了你的IP,就可以进入head,删除索引然后跑路了!!
进入Elasticsearch根目录的bin文件加,通过plugin安装
$ cd bin/
$ ./plugin install mobz/elasticsearch-head
示例
安装成功后,使用浏览器访问
http://{ip}:9200/_plugin/head/
4. 安装IK 分词器
ES自带的中文分词器只能将文字分成一个一个词,比较烂,需要我们选择别的分词器来弥补这个缺陷
首先选择对应版本的IK分词器 点击这里
IK分词器版本对照注:IK分词器的版本选择是精确到0.0.1的,举个例子
- 我现在的ES版本为2.3.0,如果我选择了IK版本为1.9.5,安装的时候就会提示,版本不对了
- 上面这幅图只是粗略地展示某些版本对应,如果你第一次安装了版本不对的IK分词器,错误信息会提示你应该下载那个本版的
选好对应的版本后,点击“Downloads”
这是ES2.3.0版本对应的IK分词器版本 点击红色标注的地方注:你也可以选择Source code下载,但是下载后需要自己使用Maven编译,执行
mvn package
命令
将zip包上传到服务器的目录/user/local/elasticsearch-2.3.0,执行如下命令:
# 先创建文件夹"ik"
$ mkdir ik
# 将zip解压到指定的文件夹
$ unzip elasticsearch-analysis-ik-1.9.0.zip -d ik/
# 删除zip包
$ rm -rf elasticsearch-analysis-ik-1.9.0.zip
这样就将IK分词器装好了,安装完后,需要重启ES才能生效,重启后访问以下链接,验证IK分词器是否生效
http://{ip}:9200/_analyze?analyzer=ik&text=%27佛山市%27
注:你可以对比一下不使用IK分词器的效果,只要将analyzer从
ik
改为default
网友评论