一、基本概念
基本介绍
全文检索属于最常见的需求,开源的ElasticSearch是目前全文搜索引擎的首选。
它可以快速地存储、搜索和分析海量数据。
底层是开源库Lucene。但是,你没法直接用Lucene,必须自己写代码去调用它的接口。ElasticSearch是Lucene的封装,提供了REST API的操作接口,开箱即用。
1. Index(索引)
动词:相当于MySQL的insert;
名词:相当于MySQL的Database。
类似于数据库的库。
2. Type(类型)
在Index(索引)中,可以定义一个或多个类型。
类似于MySQL中的Table;每一种类型的数据放在一起;
3. Document(文档)
保存在某个索引(Index)下,某种类型(Type)的一个数据(Document),文档是JSON格式,Document就像是MySQL中的某个Table里面的内容。
二、简单举例
- 分词
- 评分
三、安装
1、下载镜像文件
--存储和检索数据
docker pull elasticsearch:7.4.2
--可视化检索数据
docker pull kibana:7.4.2
2、 ElasticSearch安装
-- 新建配置和数据文件夹,供docker挂载
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
-- 设置配置文件,并写入:外部所有均可访问
echo "http.host:0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml
启动
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-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
- --name 别名,给容器起个别名。
- -p 9200,外部访问端口。-p9300,集群间通讯端口。
- -e "discovery.type=single-node",指定单节点运行。
- ES_JAVA_OPTS,指定初始64,最大128。否则可能会将内存全部沾满。
- -v,将douker的elasticsearch目录或文件挂载到外部虚拟机中,方便修改。
- -d ,指定镜像。
报错1
解决:配置文件是字符串,而非对象。检查上述的配置文件,冒号后需要有空格。
http.host: 0.0.0.0
报错2
原因:docker内的用户无权限写挂载下的目录或文件。
解决:将被挂载的目录全部修改权限为777。-R递归,目录下所有目录及其文件。
chmod -R 777 /mydata/elasticsearch/
3、Kibana安装
docker run --name kibana \
-e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 \
-p 5601:5601 \
-d kibana:7.4.2
注意:http://192.168.56.10:9200 一定改为自己的虚拟机地址
启动后验证
http://192.168.56.10:5601/
正常显示页面即可
四、初体验
1、_cat
- GET/_cat/nodes 查看所有节点
- GET/_cat/health 查看健康状况
- GET/_cat/master 查看主节点
- GET/_cat/indices 查看所有索引,类似于数据库的show databases;
2、PUT 请求
保存一个数据,保存在哪个索引的哪个类型下,指定用哪个唯一标识。
类似于在哪个数据库的哪张表,保存一条唯一数据。
PUT customer/external/1:
在cuetomer索引下的external类型下保存1号数据为:JSON数据
- 必须带唯一标识,否则报405错误。
- 标识唯一则新增,否则更新。
PUT http://192.168.56.10:9200/customer/external/2
{
"_index": "customer", //元数据:索引
"_type": "external", //元数据:类型
"_id": "1", //元数据:唯一标识
"_version": 3, //新增为1,不断更新则累加
"result": "updated", //新增为created,更新为updated
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
3、POST请求
POST http://192.168.56.10:9200/customer/external/ywOEjXgBvHJomOGQf_Dv
- 可以不带唯一标识,系统自动生成并返回。
- 使用系统返回的唯一标识进行POST,则也是更新操作。
- 也可带标识,若标识存在则为更新,不存在为新增。
- 返回保存同PUT,此处不做展示。
4、 GET请求
根据索引、类型、唯一标识获取数据
GET http://192.168.56.10:9200/customer/external/ywOEjXgBvHJomOGQf_Dv
{
"_index": "customer", //在哪个索引
"_type": "external", //在哪个类型
"_id": "ywOEjXgBvHJomOGQf_Dv", //记录ID
"_version": 2, //版本号
"_seq_no": 6, //并发控制字段,每次更新都会+1,用来做乐观锁
"_primary_term": 1, //同上,主分片重新分配,如重启,就会变化
"found": true,
"_source": { //真正的内容
"name": "fangk"
}
}
防止并发,更新携带
?if_seq_n=0&if_primary_term=1
5、特殊更新_update
作用:更新时对比json内容,若一致则不更新。
请求url尾部增加_update,内容体需要增加 "doc":{原JSON数据},否则报错
POST http://192.168.56.10:9200/customer/external/1/_update
http://192.168.56.10:9200/customer/external/1/_update
{
"doc":{
"name":"fangk"}
}
响应内容
"_version": 3, //版本号不会新增
"result": "noop", //返回noop啥都没更新
"_seq_no": 2, //乐观锁相应字段也不会增加
"_primary_term": 1
6、DELETE
删除某个数据
DELETE http://192.168.56.10:9200/customer/external/1
删除整个索引
DELETE http://192.168.56.10:9200/customer
无法删除某个类型
7、bulk批量API
PostMan无法进行此api调用,需使用kibana可视化界面。
解释
POST /customer/external/_bulk
{"index":{"_id":"1"}}
{"name":"fangkkk"}
{"index":{"_id":"2"}}
{"name":"fangkkkk"}
- 两行为一个操作,第一行为命令及文档标识,第二行为内容。
- 命令可以为增删改查。
- 响应报文中,took为用时多少毫秒,errors为是否有错误,false为没有。
- 响应报文中多个操作互不影响,一个item为一个两行操作的结果。
复杂操作集合
POST /_bulk
{"delete":{"_index":"website","_type":"blog","_id":"123"}}
{"create":{"_index":"website","_type":"blog","_id":"123"}}
{"title":"fangkkk"}
{"insex":{"_index":"website","_type":"blog"}}
{"title":"fangk"}
{"update":{"_index":"website","_type":"blog","_id":"123"}}
{"doc":{"title":"fangkkkkkk"}}