用户访问我们的首页,一般都会直接搜索来寻找自己想要购买的商品。
而商品的数量非常多,而且分类繁杂。如果能正确的显示出用户想要的商品,并进行合理的过滤,尽快促成交易,是搜索系统要研究的核心。
面对这样复杂的搜索业务和数据量,使用传统数据库搜索就显得力不从心,一般我们都会使用全文检索技术 Elasticsearch。
简介
Elastic Stack
Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”,也就是我们常说的ELK技术栈。
Elasticsearch
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用 Elasticsearch 的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到 Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
如上所述,Elasticsearch具备以下特点:
- 分布式,无需人工搭建集群
- Restful风格,一切API都遵循Rest原则,容易上手
- 近实时搜索,数据更新在Elasticsearch中几乎是完全同步的
安装和配置
1. 安装Elasticsearch
(1)新建用户
su root
useradd bigdata
(2)设置密码:
passwd123456
出于安全考虑,elasticsearch默认不允许以root账号运行
可以在启动文件:bin/elasearch中加如下面一段就可以用root启动了:
ES_JAVA_OPTS="-Des.insecure.allow.root=true"
(3)安装jdk
yum -y install java-1.8.0-openjdk*
(4)上传安装包,并解压
上传Elasticsearch相关的安装包
解压缩:
su bigdata
tar -zxvf elasticsearch-7.6.1-linux-x86_64.tar.gz
重命名目录:
mv elasticsearch-7.6.1-linux-x86_64 elasticsearch
(5)进入目录
cd elasticsearch
(6)新建两个目录
mkdir data
mkdir logs
(7)修改配置
我们进入config目录:
cd config
需要修改的配置文件有两个:
修改jvm配置
Elasticsearch基于Lucene的,而Lucene底层是java实现,因此我们需要配置jvm参数
vim jvm.options
默认配置如下:
-Xms1g
-Xmx1g
内存占用太多了,我们调小一些:
-Xms512m
-Xmx512m
修改elasticsearch.yml
vim elasticsearch.yml
添加内容
path.data: /usr/local/elasticsearch/data # 数据目录位置path.logs: /usr/local/elasticsearch/logs # 日志目录位置
修改绑定的ip
network.host: 0.0.0.0 # 绑定到0.0.0.0,允许任何ip来访问
目前我们是做的单机安装,如果要做集群,只需要在这个配置文件中添加其它节点信息即可
elasticsearch.yml的其它可配置信息
属性名说明cluster.name配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。node.name节点名,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理path.conf设置配置文件的存储路径,tar或zip包安装默认在es根目录下的config文件夹,rpm安装默认在/etc/ elasticsearchpath.data设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开path.logs设置日志文件的存储路径,默认是es根目录下的logs文件夹path.plugins设置插件的存放路径,默认是es根目录下的plugins文件夹bootstrap.memory_lock设置为true可以锁住ES使用的内存,避免内存进行swapnetwork.host设置bind_host和publish_host,设置为0.0.0.0允许外网访问http.port设置对外服务的http端口,默认为9200。transport.tcp.port集群结点之间通信端口discovery.zen.ping.timeout设置ES自动发现节点连接超时的时间,默认为3秒,如果网络延迟高可设置大些discovery.zen.minimum_master_nodes主结点数量的最少值 ,此值的公式为:(master_eligible_nodes / 2) + 1 ,比如:有3个符合要求的主结点,那么这里要设置为2
运行Elasticsearch
./bin/elasticsearch
可能的错误:
错误1:内核过低
在elasticsearch.yml下面添加配置:
bootstrap.system_call_filter:false
禁用这个插件,然后重启
错误2:文件权限不足
[1]max file descriptors…是文件权限不足
用root登录,然后修改配置文件:
vim /etc/security/limits.conf
添加下面的内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096
错误3:线程数不足
[2]: max number of threads … 是线程数不足
修改配置:
vim /etc/security/limits.d/20-nproc.conf
修改下面的内容:
* soft nproc 1024
改为:
* soft nproc 4096
错误4:进程虚拟内存不足
[3]: max virtual memory… 进程虚拟内存不足
修改配置文件:
vim /etc/sysctl.conf
添加下面内容:
vm.max_map_count=655360
然后执行命令:
sysctl -p
错误5:
[1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
修改
elasticsearch.yml
配置文件,将下面的配置加入到该配置文件中
#[discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] #配置以下三者,最少其一
cluster.initial_master_nodes: ["node-1"]#这里的node-1为node-name配置的值
最后重启终端窗口
注意:所有错误修改完毕,一定要重启你的 CRT 终端,否则配置无效
再次启动Elasticsearch
可以看到有两个端口:
9300:集群节点间通讯接口
9200:客户端访问接口
我们在浏览器中访问
2. 安装Kibana
什么是Kibana?
Kibana是一个基于Node.js的Elasticsearch索引库数据统计工具,可以利用Elasticsearch的聚合功能,生成各种图表,如柱形图,线状图,饼图等。
而且还提供了操作Elasticsearch索引数据的控制台,并且提供了一定的API提示,非常有利于我们学习Elasticsearch的语法。
安装Kibana
(1)安装Node.js
Kibana是ES的客户端工具
需要先安装Node.js
tar -vxf node-v12.18.2-linux-x64.tar.xz
mv node-v12.18.2-linux-x64 nodejs
ln -s /usr/local/nodejs/bin/node /usr/local/bin
ln -s /usr/local/nodejs/bin/npm /usr/local/bin
node -v
(2)解压kibana
tar -vxf kibana-7.6.1-linux-x86_64.tar.gz
mv kibana-7.6.1-linux-x86_64 kibana
(3)修改 config/kibana.yml 添加
server.host:"0.0.0.0"elasticsearch.url:"http://localhost:9200"
或者
elasticsearch.hosts:["http://localhost:9200"]
(4)启动
./bin/kibana
kibana的端口是5601,在浏览器打开后,可以测试查询
可能的错误:
错误1:
FATAL Error: [config validation of [elasticsearch].url]: definition for this key is missing
需要将 url 换成 hosts,在
config/kibana.yml
进行修改
elasticsearch.hosts:["http://localhost:9200","http://本机IP:9200"]# elasticsearch.url: "http://localhost:9200"
错误2:
[warning][savedobjects-service] Unable to connect to Elasticsearch. Error: Request Timeout after 30000ms
修改
kibana.yml
配置文件,将
requestTimeout
设置大一点
elasticsearch.requestTimeout:40000
错误3
[savedobjects-service] Unable to connect to Elasticsearch. Error: [master_not_discovered_exception] null
修改
config/elasticsearch.yml
配置文件,将以下内容取消注释
node.name: node-1cluster.initial_master_nodes:[“node-1”]
3. 安装ik分词器
分词器能把一个字符串拆分成多个单词,搜索时再按每个单词分别索引,这样能大大提高搜索效率。
如:“我是中国人"拆分为"我”、“是”、“中国”、“国人”、“中国人”。
安装步骤:
(1)下载分词器安装包,版本和ES版本一致
如: elasticsearch-analysis-ik-6.2.4.zip
(2)上传到elasticsearch/plugins目录中,然后解压
unzip elasticsearch-analysis-ik-6.2.4.zip
(3)使用kibana测试
4. Elasticsearch基本操作
创建索引
PUT /test
创建类型并进行映射
PUT /test/_mapping/student
{"properties":{"name" :{"type":"text",
"analyzer":"ik_max_word"},
"gender":{"type":"keyword"},
"age":{"type":"integer"}}}
添加数据
POST /test/student
{"name":"张三三",
"gender":"男",
"age":"20"}
修改数据
PUT /test/student/B6eRR3cBeDxKxs3sWYow
{"name":"张三",
"age":"33",
"gender":"F"}
删除数据
GET /test/student/_search/B6eRR3cBeDxKxs3sWYow-
查询数据
GET /test/student/_search
版权归原作者 Cafune936 所有, 如有侵权,请联系我们删除。