Elastisearch-快速入门
全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。
Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。
基本概念
Index(索引)
Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
- 动词,相当于mysql的insert
- 名词,相当于mysql的database
Type(类型)
在 Index(索引)中,可以定义一个或多个类型。
类似于 MySQL 的 Table,每一种类 型的数据存放在一起。
比如把一条数据存在ES的某个index下的某个type下,类型和索引通俗点即为 index为数据库,type为数据表,存在某个数据库的某张表下
在Elasticsearch6.0之后,Type 类型被移除。
Document(文档)
保存在某个 Index(索引)下,某种 Type(类型)的一个数据,Document(文档)是JSON格式的,Document 就像是 MySQL 中某个 Table 里面每一行的数据,字段就是Document里的属性。
Document(文档)就相当于是在数据库中的数据,文档里面的属性,就相当于列名,格式为json
一个词拆分成多个关键词
Docker安装Elasticsearch、Kibana
1. 下载镜像文件
# 存储和检索数据
docker pull elasticsearch:7.4.2
# 可视化检索数据
docker pull kibana:7.4.2
2. 配置挂载数据文件夹
# 创建配置文件目录
mkdir -p /mydata/elasticsearch/config
# 创建数据目录
mkdir -p /mydata/elasticsearch/data
# 将/mydata/elasticsearch/文件夹中文件都可读可写
chmod -R 777 /mydata/elasticsearch/
# 配置任意机器可以访问 elasticsearch
echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml
3. 启动Elasticsearch
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-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
命令后面的 \是换行符,注意前面有空格
- 9200 :是后面发送http请求的端口
- 9300 :是es在分布式集群下的通信端口
- -e “discovery.type=single-node” 以单节点启动
- -e ES_JAVA_OPTS="-Xms64m -Xmx512m" 设置启动占用内存,指定最小内存和最大内存
- -v:挂载容器中的配置文件、数据文件、插件数据到本机的文件夹;
- -d elasticsearch:7.6.2:指定要启动的镜像
- 访问 IP:9200 看到返回的 json 数据说明启动成功。
设置 Elasticsearch 随Docker启动
# 当前 Docker 开机自启,所以 ES 现在也是开机自启
docker update elasticsearch --restart=always
启动可视化Kibana
docker run --name kibana \
-e ELASTICSEARCH_HOSTS=http://ES安装的主机地址:9200 \
-p 5601:5601 \
-d kibana:7.4.2
浏览器输入ip:5601 测试:
6. 设置 Kibana 随Docker启动
# 当前 Docker 开机自启,所以 kibana 现在也是开机自启
docker update kibana --restart=always
Elasticsearch-使用入门(初步检索)
ES作为一个存储分析和检索一个引擎,对ES的所有操作,ES都封装成了REST API 发请求就行了
1. _cat(查询ES信息)
- GET: /_cat/nodes:查看所有节点
- GET: /_cat/health:查看ES健康状况
- GET: /_cat/master:查看主节点信息
- GET: /_cat/indicies:查看所有索引
索引一个文档(保存一条记录)
ES: 保存一条数据,保存在哪个索引下的哪个类型下,指定用哪个唯一标识
MySQL: 保存一条数据,保存在哪个数据库的哪张表下
customer/external/1 在customer索引(数据库)下的external(表)类型下保存1号数据
PUT 和 Post 都可以,
- post 新增。如果不指定id,会自动生成id。指定id就会修改这个数据,并增加版本号
- put 可以新增可以修改。put必须指定id,由于put需要指定id,一般用来做修改操作,不指定id会报错。
查询文档
GET index/type/id
{
"_index": "customer", # 在哪个索引(库)
"_type": "external", # 在哪个类型(表)
"_id": "1", # 文档id(记录)
"_version": 5, # 版本号
"_seq_no": 4, # 并发控制字段,每次更新都会+1,用来做乐观锁
"_primary_term": 1, # 同上,主分片重新分配,如重启,就会变化
"found": true,
"_source": { # 数据
"name": "zhangsan"
}
}
# 乐观锁更新时携带 ?_seq_no=0&_primary_term=1 当携带数据与实际值不匹配时更新失败
更新文档
/index/type/id/_update
几种更新文档的区别
在上面索引文档即保存文档的时候介绍,还有两种更新文档的方式:
- 当PUT请求带id,且有该id数据存在时,会更新文档;
- 当POST请求带id,与PUT相同,该id数据已经存在时,会更新文档;
这两种请求类似,即带id,且数据存在,就会执行更新操作。
类比: - 请求体的报文格式不同,_update方式要修改的数据要包裹在 doc 键下
- _update方式不会重复更新,数据已存在不会更新,版本号不会改变,另两种方式会重复更新(覆盖原来数据),版本号会改变
- 这几种方式在更新时都可以增加属性,PUT请求带id更新和POST请求带id更新,会直接覆盖原来的数据,不会在原来的属性里面新增属性