全文搜索属于最常见的需求,开源的Elasticsearch 是目前全文搜索引擎的首选。
它可以快速地储存、搜索和分析海量数据。
一、基本名词
索引
相当于mysql的数据库
类型(6.0之后已移除)
相当于mysql的表
文档
相当于mysql表里的数据,也就是msyql中的行
属性(字段)
相当于mysql的列名
映射
相当于mysql中个字段中的数据类型
----es里面所有数据都是json格式保存的
二、安装
1、下载镜像文件
docker pull elasticsearch:7.4.2 存储和检索数据
docker pull kibana:7.4.2 可视化检索数据
2、创建实例
1). 创建所需文件夹
mkdir -p /mydata/elasticsearch/config (用于存放es配置文件)
mkdir -p /mydata/elasticsearch/data(用于存放es数据)
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
. 创建容器实例
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 --privileged=true \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
若启动容器之后会闪退,查看日志(Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes",)需设置权限运行下列语句
chmod -R 777 /mydata/elasticsearch/
(该命令表示文件所有者有读写执行权限(4+2+1)、文件所属组有读写执行权限(4+2+1)、其他人有读写执行权限(4+2+1))
之后再启动就不闪退了
(端口9200用于发送请求的端口,端口9300用于es集群节点之间的通讯端口)
(第一个-e表示单节点启动,第二个-e设置占用内存的初始值占用64M与最大值占用256M,避免一启动就直接占满内存导致整个虚拟机卡死)
(第一个-v是将容器内的elasticsearch.yml文件与虚拟机中的elasticsearch.yml进行关联,这样以后修改虚拟机中的文件时将同步至容器内的该文件,后两个-v挂载文件,也是同理,文件夹里有变化会相应同步之容器内的该文件夹中)
三、安装kibana可视化界面
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.111.200:9200 -p 5601:5601 \
-d kibana:7.4.2
使用它直接访问网页http://192.168.111.200:5601
至此,即可开始直接在网址或者网址打开kibana中使用es了。
四、初步检索
1、_cat
GET /_cat/nodes:查看所有节点(如:http://192.168.111.200:9200/_cat/nodes)
GET /_cat/health:查看es 健康状况
GET /_cat/master:查看主节点
GET /_cat/indices:查看所有索引(相当于mysql中的show databases;)
2、索引一个文档(保存)
发送PUT请求:http://192.168.111.200:9200/customer/external/1
请求体:{"name": "John Doe"}
customer:这里是索引,相当于mysql数据库
external:这里是类型,相当于mysql的数据表
1:是标识
最后返回结果如下:
{
"_index": "customer", //(索引)
"_type": "external", //(类型)
"_id": "1", //(保存数据的id)
"_version": 1, //(版本)
"result": "created", //(最终的结果:新建)
"_shards": { //(分片)
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
当再发送同样的一次时,其中的version和result会改变
{
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
PUT 和POST 都可以,区别是put必须带id,而post可以不带
POST 新增。如果不指定id,会自动生成id。指定id 就会修改这个数据,并新增版本号
PUT 可以新增可以修改。PUT 必须指定id;由于PUT 需要指定id,我们一般都用来做修改
操作,不指定id 会报错。
3、查询文档
发送get请求:http://192.168.111.200:9200/customer/external/1
{
"_index": "customer", //在哪个索引
"_type": "external", //在哪个类型
"_id": "1",
"_version": 2, //版本号
"_seq_no": 1, //并发控制字段,每次更新就会+1,用来做乐观锁
"_primary_term": 1, //同上,主分片重新分配,如重启,就会变化
"found": true, //(true表示找到了这个数据)
"_source": { //(查找到的数据内容)
"name": "John Doe"
}
}
更新携带?if_seq_no=0&if_primary_term=1可以做一个乐观锁操作
发送put请求:http://192.168.111.200:9200/customer/external/1?if_seq_no=1&if_primary_term=1
若seq_no不对,则不能修改
{
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 3,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
再get请求查询:http://192.168.111.200:9200/customer/external/1
seq_no会更新为2,数据也会更新
{
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 3,
"_seq_no": 2,
"_primary_term": 1,
"found": true,
"_source": {
"name": 1
}
}
4、更新文档
除上面保存操作中的更新操作,还有如下专门末尾带_update的更新操作
发送post请求:http://192.168.111.200:9200/customer/external/1/_update
请求体中需要写如下doc的固定格式
{
"doc":{
"name": "John Doew"
}
}
返回数据如下
{
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 4,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
若继续发送该请求,会对比原来数据,不会像保存操作那样继续更新版本号,只是结果为noop,表示没有改变的意思
{
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 4,
"result": "noop",
"_shards": {
"total": 0,
"successful": 0,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
另外,两种方式都可在更新数据的同时,增加属性,如下:
{
"doc": { "name": "Jane Doe", "age": 20 }
}
即可加入age属性
{
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 5,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 4,
"_primary_term": 1
}
查询之后:http://192.168.111.200:9200/customer/external/1,得到
{
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 5,
"_seq_no": 4,
"_primary_term": 1,
"found": true,
"_source": {
"name": "Jane Doe",
"age": 20
}
}
5、删除数据/索引
发送delete请求删除数据:http://192.168.111.200:9200/customer/external/1
{
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 6,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 5,
"_primary_term": 1
}
发送delete请求删除索引:h