搭建ElasticSearch本地搜索引擎

当前网站使用的是Google搜索,通过表单的形式提交搜索内容+site:yatesun.com,从而达到站内搜索的目的。但Google未必是所有访客都能访问到,因此我也希望能够自己建立一套独立可行的搜索功能,着手开始研究基于Lucene的ElasticSearch,希望能以此打造一个真正的站内搜索。

一、安装 ElasticSearch

需要先安装Java环境,安装前可能我们并不知道最新的java版本,可以用以下命令查找。

1
yum list java*

java-1.8.0-openjdk-headless.x86_64正是将要用到的。

1
yum install java-1.8.0-openjdk-headless.x86_64

检查当前最新版本
由于IK分词暂时不支持2.2.0,所以我还是选择了2.1.1,没有使用最新版本。
我选择了最新版的2.3.1版,分词器选择1.9.1版。
由于无法使用root用户直接运行,在使用root的情况下,可以按以下命令下载、执行,我添加了用户elasticsearch专门用来运行ElasticSearch。

1
2
3
4
5
6
7
8
adduser elasticsearch
cd /home/elasticsearch/
wget -c https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.2/elasticsearch-2.3.2.tar.gz
tar -zxf elasticsearch-2.3.2.tar.gz
mv elasticsearch-2.3.2 es
chown elasticsearch:elasticsearch es -R
su - elasticsearch -c "chmod a+x es/bin/elasticsearch"
su - elasticsearch -c "./es/bin/elasticsearch"

另行启动一个shell,用curl验证服务开启情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
curl -XGET http://127.0.0.1:9200/?pretty

{
"name" : "Eon",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.3.2",
"build_hash" : "b9e4a6acad4008027e4038f6abed7f7dba346f94",
"build_timestamp" : "2016-04-21T16:03:47Z",
"build_snapshot" : false,
"lucene_version" : "5.5.0"
},
"tagline" : "You Know, for Search"
}

可修改config/elasticsearch.yml,加入

1
2
network.bind_host: "0.0.0.0"
network.publish_host: _non_loopback:ipv4_

二、安装 IK Analysis

一般的搜索,都需要有一个方便易用的分词器,默认的分词似乎还不能满足需求,因此,根据作者的建议,我也使用了elasticsearch-analysis-ik作为分词插件。

安装maven

下载maven最新版本

1
2
3
4
wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
tar -zxf apache-maven-3.3.9-bin.tar.gz
ln -s apache-maven-3.3.9 apache-maven
vim /etc/profile

加入如下文字:

1
2
3
export M2_HOME=/home/elasticsearch/apache-maven
PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
export PATH

执行mvn -V检验是否安装成功。

安装分词器

1
2
3
4
5
6
7
8
9
10
11
12
13
wget -c https://codeload.github.com/medcl/elasticsearch-analysis-ik/zip/master
unzip unzip master
cd elasticsearch-analysis-ik-master
yum install maven
mvn package
cd target/releases/
mkdir /home/elasticsearch/es/plugins/ik
mv elasticsearch-analysis-ik-1.9.2.zip /home/elasticsearch/es/plugins/ik/
cd /home/elasticsearch/es/plugins/ik/
unzip elasticsearch-analysis-ik-1.9.2.zip
cd ../
chown elasticsearch:elasticsearch * -R
su - elasticsearch -c "./es/bin/elasticsearch"

重新测试,另行启动一个shell,用curl验证服务开启情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
curl -XGET http://127.0.0.1:9200/?pretty

{
"name" : "Melody Guthrie",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.3.2",
"build_hash" : "b9e4a6acad4008027e4038f6abed7f7dba346f94",
"build_timestamp" : "2016-04-21T16:03:47Z",
"build_snapshot" : false,
"lucene_version" : "5.5.0"
},
"tagline" : "You Know, for Search"
}

可以发现,已成功开启。

三、为搜索引擎配置同义词

config/elasticsearch.yml中加入以下配置(使用原文作者建议,未深入研究):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
index:
analysis:
analyzer:
ik_syno:
type: custom
tokenizer: ik_max_word
filter: [my_synonym_filter]
ik_syno_smart:
type: custom
tokenizer: ik_smart
filter: [my_synonym_filter]
filter:
my_synonym_filter:
type: synonym
synonyms_path: analysis/synonym.txt

其中ik_syno会将文本做最细粒度的拆分,ik_syno_smart较前者而言,要更粗一些。
还可以在config/analysis/synonym.txt中加入同义词文件,如:

1
2
ua,user-agent,userAgent
Forward Secrecy =>FS

四、安装Marvel

Marvel是一个集群和数据管理界面,安装后能直接管理elasticsearch的数据。
在elasticsearch目录执行

1
2
bin/plugin install license
bin/plugin install marvel-agent

安装kibana依赖

1
2
3
4
wget https://download.elastic.co/kibana/kibana/kibana-4.5.0-linux-x64.tar.gz
tar -zxf kibana-4.5.0-linux-x64.tar.gz
mv kibana-4.5.0-linux-x64 kibana
vim config/kibana.yml

继续安装

1
bin/kibana plugin --install elasticsearch/marvel/latest

启动两个服务

1
2
bin/elasticsearch
bin/kibana

访问路径http://localhost:5601/app/marvel

五、其他

还包括JavaScript API、php API和全文搜素的实现,时间有限,还未来得及实现,下次再更。
附上参考来源,作者JerryQu。