介绍
介绍
Elasticsearch是一个文档型数据库引擎,和MongoDB类似,它的数据也是以一个一个文档的形式存储起来的,同样的它的数据也是JSON数据类型的。和MongoDB最大的区别是Elasticsearch的重点是在搜索上,从名字也可以看得出来,Elasticsearch基于Lucene全文检索引擎,可以轻松建立一个BM25算法的全文搜索引擎。
今天我们就来学习如何安装配置ElasticSearch搜索引擎,跟着福哥来吧~~
基本信息
安装环境
CentOS:CentOS Linux release 7.6.1810 (Core)
Linux:Linux version 3.10.0-1062.el7.x86_64
GCC:gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
软件版本
准备工作
本地化
timedatectl set-timezone Asia/Shanghai
安装wget
如果环境里没有wget,通过yum安装一下
yum -y install wget
建立环境根目录
mkdir -p /tongfu.net/env/
建立安装包目录并进入
mkdir /packages cd /packages
安装
官网下载
官网下载Elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.2.tar.gz
网盘下载
如果官网下载太慢可以从网盘下载
链接: https://pan.baidu.com/s/1Fay75ADcmfX41xcUdU3hJA 提取码: kfms
JDK官网下载
必须通过网页下载,需要勾选“接受协议”,所以不能用wget直接下载了!
网页地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
JDK网盘下载
这里也提供一个网盘下载地址,如果不会从官网下载或者下载太慢可以从这里下载
链接: https://pan.baidu.com/s/1szuuSTpjIon5qrPY-SH3NQ 提取码: bp2y
安装
Docker安装
因为安装elastic search引擎需要去掉内存使用限制,所以如果我们想要安装在Docker容器内,则创建Docker容器时候需要增加如下参数设置
--ulimit memlock=-1:-1 --ulimit nofile=65536:65536
vm.max_map_count
默认 vm.max_map_count 是 65530,需要加大到 262144(Docker安装需要在宿主机上执行)
[root@tongfunet]# vi /etc/sysctl.conf vm.max_map_count=262144
使sysctl的配置改动立即生效(不需要重启服务器)
sysctl -p
建立用户
useradd es
解压缩Elasticsearch
tar -xzvf elasticsearch-6.5.2.tar.gz -C /tongfu.net/env/
设置权限Elasticsearch
chown es.es -R /tongfu.net/env/elasticsearch-6.5.2/
解压缩jdk
tar -xzvf jdk-8u192-linux-x64.tar.gz -C /tongfu.net/env/
优化
设置JVM内存使用
建议设置初始化内存和最高内存都是物理内存的一半
[root@tongfunet]# vi /tongfu.net/env/elasticsearch-6.5.2/config/jvm.options # Xms represents the initial size of total heap space # Xmx represents the maximum size of total heap space -Xms4g -Xmx4g
ES设置
设置启动内存锁定
把 bootstrap.memory_lock: true 前面的 # 去掉
[root@tongfunet]# vi /tongfu.net/env/elasticsearch-6.5.2/config/elasticsearch.yml # # Lock the memory on startup: # bootstrap.memory_lock: true
设置IP
默认elasticsearch只能通过127.0.0.1访问,我们需要设置一下IP地址
[root@tongfunet]# vi /tongfu.net/env/elasticsearch-6.5.2/config/elasticsearch.yml # network.host: 0.0.0.0 # # Set a custom port for HTTP: # http.port: 9200
启动
启动ES
建立启动脚本
[root@tongfunet]# cat > /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-start <<EOF #!/bin/sh export JAVA_HOME=/tongfu.net/env/jdk1.8.0_192/ # argv esroot=/tongfu.net/env/elasticsearch-6.5.2 # quit pid="\`ps -ax|grep \${esroot}|grep java|awk '{print \$1}'\`" if [ "" = "\$pid" ] ; then echo "starting..." \$esroot/bin/elasticsearch -d else echo "started" fi EOF
停止ES
建立停止脚本
[root@tongfunet]# cat > /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-quit <<EOF #!/bin/sh # env export PATH # argv esroot=/tongfu.net/env/elasticsearch-6.5.2 # quit pid="\`ps -ax|grep \${esroot}|grep java|awk '{print \$1}'\`" if [ ! "" = "\$pid" ] ; then echo "stopping..." /bin/kill \$pid else echo "stopped" fi EOF
授权脚本
授权脚本可执行权限
chmod 0755 /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-start chmod 0755 /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-quit chown es.es /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-start chown es.es /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-quit
自动启动
添加自动启动脚本
[root@tfdev packages]# cat > /lib/systemd/system/elasticsearch.service <<EOF [Unit] Description=elasticsearch After=network.target [Service] Type=forking LimitNOFILE=65536 LimitNPROC=65536 LimitMEMLOCK=infinity User=es Group=es ExecStart=/tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-start ExecStop=/tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-quit PrivateTmp=true [Install] WantedBy=multi-user.target EOF
使用 systemctl 管理 redis 服务
systemctl enable elasticsearch # 设置自动启动 systemctl start elasticsearch # 启动服务 systemctl stop elasticsearch # 停止服务 systemctl restart elasticsearch # 重启服务
测试
[root@tongfunet]# curl 'http://localhost:9200/' { "name" : "QguZy94", "cluster_name" : "elasticsearch", "cluster_uuid" : "O5CfJjefQRWrkVe8_yRQoA", "version" : { "number" : "6.5.0", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "816e6f6", "build_date" : "2018-11-09T18:58:36.352602Z", "build_snapshot" : false, "lucene_version" : "7.5.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" }
使用
准备
建议使用工具Postman进行调试。
ES里的index(索引)对应数据库里的数据库名称
ES里的数据是文档型的,每个类型下面可以有多个文档,文档结构必须一致
如果文档结构有大的变化,需要建立新的类型,因为旧的数据已经存入缓存,无法立即更新
写入数据
通过POST方式请求如下地址,索引名称 index1
POST /index1 { "id":1, "class":10, "name":"北京" }
我们按照这个结果插入多个文档进去,例如:上海,天津,河北,河南。
为了测试我们再写入河北省,河南省两个文档进去。
获取数据
通过GET方式请求如下地址
GET /index1/_search { "_index": "index1", "_type": "type1", "_id": "1", "_version": 1, "found": true, "_source": { "id": 1, "class": 10, "name": "北京" } }
标准搜索
关键字搜索
搜索包含“河”的文档
POST /index1/_search { "from" :0, "size" :10, "query" :{ "match" :{ "name":"河" } } }
搜索包含“河北省”且class为20的文档
注意:这里的 must 相当于数据库里的“and”,“or”则用 should 表示,must、should必须配合 bool 使用
POST /index1/_search { "from" :0, "size" :10, "query" :{ "bool" :{ "must" :[ { "terms" :{ "class":[20] } }, { "match" :{ "name":"河省" } } ] } } }
以上语法可以将“河北”,“河南”,“河北省”,“河南省”全部查询出来,因为任何一个字命中都会被找出来
如果我们希望只找出那些完全包含给定关键字的文档出来,可以使用以下语句
POST /index1/_search { "from" :0, "size" :10, "query" :{ "bool" :{ "must" :[ { "terms" :{ "class":[20] } }, { "match_phrase" :{ "name":"河省" } } ] } } }
使用match_phrase替代match,表示完全匹配模式,即:关键字的必须完全命中,且出现顺序才会被查询出来
分组统计
获得包含“河”的文档的class列表
POST /index1/_search { "from" :0, "size" :0, "query" :{ "bool" :{ "must" :[ { "match" :{ "name":"河" } } ] } }, "aggs":{ "group_by_class":{ "terms":{ "field":"class", "size":1000 } } } }
结果如下
{ "took": 2, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 3, "max_score": 0, "hits": [] }, "aggregations": { "group_by_class": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": 20, "doc_count": 3 } ] } } }
这里使用的是aggregations模拟数据库的group by功能,group_by_class是别名可以随便起
如果分组的字段是字符串类型,则需要在字段后面加上“.keyword”,例如:class.keyword
类型与映射
字段类型
设置字段类型
删除索引
删除索引
DELETE http://localhost:9200/index1
数据备份/还原
安装工具
安装导入导出工具 elasticdump
cd /tongfu.net/env/elasticsearch-6.5.2/bin/ yum -y install epel-release yum -y install nodejs npm install elasticdump
导出/导入
从一个es导出mappings到另一个es
./elasticdump --input=http://[源ES]/demo_index --output=http://[目标ES]/demo_index --type=mapping
从一个es导出数据到另一个es
./elasticdump --input=http://[源ES]/demo_index --output=http://[目标ES]/demo_index --type=data
将es数据导出到json文件
./elasticdump --input=http://[源ES]/demo_index --output=my_data.json --type=data
从json文件导入数据到es
./elasticdump --input=my_data.json --output=http://[目标ES]/demo_index --type=data
常见错误
错误1
如果在写入数据的时候遇到这个错误信息 FORBIDDEN/655/index1 read-only / allow delete (api),可以通过执行下面的命令修复
PUT /index1/_settings { "index.blocks.read_only_allow_delete":"false" }