环境:Centos 7;jdk 8;Elasticsearch 6.4.3;Postman全局:{{eshost}}:http://ip:9200
简介
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。Lucene是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
但Lucene 只是一个库,必须要懂一点搜索引擎原理的人才能用的好,所以后来又有人基于 Lucene 进行封装,写出了 Elasticsearch。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,通过http请求就能进行操作了,从而让全文搜索变得简单。
所以集成Elasticsearch,也就是我们通过内置api操作ES服务器上的数据。
想要深入地理解ElasticSearch的工作原理,特别是索引和查询这两个过程,可以去查阅下Lucene的工作原理。
Elasticsearch一些内部用词概念:
【索引Index】可以先简单理解为:存放数据的地方,类似mysql中的一个库
【类型Type】可以先简单理解为:定义数据结构,类似mysql中的一个表
【文档Document】可以先简单理解为:数据,类似mysql中的一个表中的一条条数据
搭建
0,安装Jdk:yum install java-1.8.0-openjdk
1,安装Elasticsearch
法一:elasticsearch官方网页下载:https://www.elastic.co/cn/downloads/elasticsearch
法二:使用wget下载命令:wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.3.tar.gz
2,解压到 /usr/local:tar -zxvf elasticsearch-6.4.3.tar.gz -C /usr/local
3,运行Elasticsearch,执行命令:./bin/elasticsearch,后面加上“-d”后台运行
Elasticsearch 要求不能使用超级用户root运行,这里建立一个testuser账号
# 创建testuser账户:adduser testuser
# 修改密码:passwd testuser123
给testuser用户elasticsearch目录的授权,切换至elasticsearch目录,并以testuser用户运行
重新执行启动命令
如没有error,应该就启动成功了
4,新开一个终端,用curl访问验证:curl 'http://localhost:9200/?pretty'
查看端口会发现,启了9200和9300端口。9300是tcp通讯端口,集群间和TCPClient都走的它,9200是http协议的restful接口
5,远程访问服务器Elasticsearch节点信息
由于本次安装在远程linux主机上,故需要通过配置和开放防火墙9200端口
输入远程linux主机的公网ip,端口号为9200,显示无法访问
配置linux主机的防火墙,开放9200端口命令:
iptables -I INPUT -p tcp --dport 9200 -j ACCEPT
iptables-save
搭建过程可能会遇到的问题:
[问题1]: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
报错描述:文件描述符太低
解决办法:切换到root用户,修改/etc/security/limits.conf
su root
vim /etc/security/limits.conf
在文末加入:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
输入命令:exit,切换回testuser用户,启动elasticsearch
[问题2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
报错描述:max_map_count 的值是指一个进程最多可用于的内存映射区(memory map areas),在调用malloc会用到,由mmap/mprotect生成。
解决办法:切换到root用户,修改配置/etc/sysctl.conf
su root
vim /etc/sysctl.conf
在文末加入:
vm.max_map_count=655360
然后使其生效
sysctl -p
输入命令:exit,切换回testuser用户,启动elasticsearch
[问题3]: 有时候启动elasticsearch时候会提示内存不足,然后启动不了,这时候可以改小jvm最小内存
解决办法:
cat config/jvm.options
修改:
-Xms1g 改成 -Xms512m
重新启动elasticsearch
[问题4]: ERROR: [1] bootstrap checks failed[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文件
修改:
将 #cluster.initial_master_nodes: ["node-1", "node-2"]
修改为 cluster.initial_master_nodes: ["node-1"]
重新启动elasticsearch
[问题5]: [INFO][Ko.e.c.r.a.DiskThresholdMonitor] [ZAds5FP] low disk watermark [85%] exceeded on [ZAds5FPeTY-ZUKjXd7HJKA][ZAds5FP] [/opt/elasticsearch-6.2.4/data/nodes/0] free: 1.2gb[14.2%], replicas will not be assigned to this node
报错描述:内存空间不够
解决办法:
#调整jvm内存大小
vi bin/elasticsearch
ES_JAVA_OPTS="-Xms512m -Xmx512m"
重新启动elasticsearch
[问题6]: 启动子节点报错Exception in thread "main" java.nio.file.AccessDeniedException
报错描述:testuser不具备文件权限不足而被拒绝执行
解决办法:给testuser用户添加slave的elasticsearch目录的授权
// chown -R 用户名 文件(目录)名
chown -R testuser /usr/local/salve1/elasticsearch-6.4.3/
重新启动elasticsearch
创建一个索引
直接通过请求,创建一个简单的索引
备注:keyword时不参与分词的,必须全匹配
查询全部索引
给索引post插入数据
查询数据
编辑数据
注意:Elasticsearch会先把:如下id为2的数据删掉,再新增
中文分词
中文分词使用IK分词效果比较好,推荐一个开源的IK分词器:
https://github.com/medcl/elasticsearch-analysis-ik
按照readme提示,演示es版本是6.4.3,直接用一下命令安装:
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.3/elasticsearch-analysis-ik-6.4.3.zip
上面的这个analyzer可以替换成ik_max_word,可以ik_smart效果是不同的,ik_max_word比ik_smart更加细分
所以在上面创建索引指定分词时,增加中文分词配置效果是最好的:
- "analyzer": "ik_max_word",
- "search_analyzer": "ik_smart"
Elasticsearch-Head插件介绍
elasticsearch-head是一个界面化的集群操作和管理,可用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等。你可以通过插件把它集成到es服务器(首选方式),也可以把elasticsearch-head项目下载下来,本地启动(需要处理跨域问题)。
elasticsearch-head 插件的安装在 Linux 和 Windows 没什么区别,安装之前确保当前系统已经安装 nodejs 即可。
下面是本地启动elasticsearch-head项目:
一,Elasticsearch分布式配置
1,修改主节点配置文件,vim config/elasticsearch.yml
#添加一下配置
cluster.name: kobe
node.name: master
node.master: true
重启master服务
2,修改子节点配置文件,vim config/elasticsearch.yml
cluster.name: kobe
node.name: slave1
http.port: 9800
#设置主动发现主节点地址
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
重启slave服务;如果提示id重复,删除slave1文件夹下的data文件夹下的节点数据,然后重启即可
二,启动Elasticsearch-Head
方式一:Elasticsearch服务器安装插件
方式二:Chrome中安装插件
方式三:elasticsearch-head项目下载下来,本地启动
这里只记录方式三:
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install 或者cnpm install(需要安装淘宝镜像)
npm run start
打开浏览器 http://localhost:9100/
可能出现的问题:Failed to load http://192.168.0.191:9200/: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9100' is therefore not allowed access.
问题描述:无法正常连接到elasticsearch服务,这是因为elasticsearch服务与elasticsearch-head之间可能存在跨越
解决:修改elasticsearch配置即可,在elastichsearch.yml中添加如下命名即可:
#allow origin
http.cors.enabled: true
http.cors.allow-origin: "*"
连接成功显示:
备注:较粗的是主分片,细线的是备份分片
参考文档:
终于有人把Elasticsearch原理讲透了!
Mastering Elasticsearch(中文版)