目录
一、Elasticsearch介绍和安装
用户访问首页时,一般都会直接搜索来寻找自己想要购买的商品。而商品的数量非常多,而且分类繁杂。如果能正确的显示出用户想要的商品,并进行合理的过滤,尽快促成交易,是搜索系统要研究的核心。面对这样复杂的搜索业务和数据量,使用传统数据库搜索就显得力不从心,一般都会使用全文检索技术,例如:Elasticsearch。
1.1 简介
Elasticsearch是一个分布式的RESTful风格的搜索和数据分析引擎。Elasticsearch具备以下特点:
-
分布式,无需人工搭建集群(solr就需要人为配置,使用Zookeeper作为注册中心)
-
Restful风格,一切API都遵循Rest原则,容易上手
-
近实时搜索,数据更新在Elasticsearch中几乎是完全同步的。
1.2 安装和配置
在linux下安装Elasticsearch。
将压缩包上传,然后解压缩:tar -zxvf elasticsearch-6.4.2.tar.gz
如果解压缩发生错误:tar: 归档文件中异常的 EOF,需要重新下载安装包。
1.3 运行
进入elasticsearch/bin目录,可以看到下面的执行文件:
然后输入命令: ./elasticsearch
会发生错误,下面就常见的错误进行总结。
1.3.1 内核过低
Elasticsearch的插件要求centos的linux内核至少3.5以上版本 ,修改elasticsearch.yml文件,在最下面添加如下配置:
bootstrap.system_call_filter: false
然后重启。
1.3.2 文件权限不够
[1]: max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
切换为root用户,然后修改配置文件:vim /etc/security/limits.conf
添加下面内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096
1.3.3 线程数不够
[1]: max number of threads [1024] for user [leyou] is too low, increase to at least [4096]
继续配置
打开文件夹:cd /etc/security/limits.d
修改里面以conf结尾的文件
将
* soft nproc 1024
改为
* soft nproc 4096
1.3.4 进程虚拟内存
[3]: max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
m.max_map_count:限制一个进程可以拥有的VMA(虚拟内存区域)的数量,继续修改配置文件:
vim /etc/sysctl.conf
添加下面内容:
vm.max_map_count=655360
然后执行命令:
sysctl -p
1.3.5 重启
可以看到绑定了两个端口:
-
9300:集群节点间通讯接口
-
9200:客户端访问接口
我们在浏览器中访问:http://192.168.19.121:9200/
1.4 安装Kibana
Kibana是一个基于Node.js的Elasticsearch索引库数据统计工具,可以利用Elasticsearch的聚合功能,生成各种图表,如柱形图,线状图,饼图等。而且还提供了操作Elasticsearch索引数据的控制台,并且提供了一定的API提示。
在windows下使用kibana,与elasticsearch的版本保持一致。
1.4.1 配置
进入安装目录下的config目录,修改kibana.yml文件:
修改elasticsearch服务器的地址:
elasticsearch.url: "http://192.168.19.121:9200/"
1.4.2 运行
进入安装目录下的bin目录:
双击运行:
发现kibana的监听端口是5601 ,访问http://127.0.0.1:5601
1.4.3 控制台
选择左侧的DevTools菜单,即可进入控制台页面:
在页面右侧,我们就可以输入请求,访问Elasticsearch了。
1.5 安装ik分词器
将分词器解压到Elasticsearch目录的plugins目录中 ,
解压命令:unzip elasticsearch-analysis-ik-6.3.0.zip -d ik-analyzer
然后重启elasticsearch。
测试:
在kibana控制台输入下面的请求:
POST _analyze
{
"analyzer": "ik_max_word",
"text": "我是中国人"
}
运行得到结果:
{
"tokens": [
{
"token": "我",
"start_offset": 0,
"end_offset": 1,
"type": "CN_CHAR",
"position": 0
},
{
"token": "是",
"start_offset": 1,
"end_offset": 2,
"type": "CN_CHAR",
"position": 1
},
{
"token": "中国人",
"start_offset": 2,
"end_offset": 5,
"type": "CN_WORD",
"position": 2
},
{
"token": "中国",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 3
},
{
"token": "国人",
"start_offset": 3,
"end_offset": 5,
"type": "CN_WORD",
"position": 4
}
]
}