Elasticsearch 笔记
一、入门
1.1 简介
Elasticsearch 是一个分布式的免费开源搜索和分析引擎。可通过 REST API 接口来操作数据,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据,是目前全文搜索引擎的首选。mysql专注于数据的持久化存储与管理,而Elasticsearch更善于海量数据的检索与分析。
1.2 基本概念
概念 | 解释 |
---|---|
cluster(集群) | 整个elasticsearch 默认就是集群状态,整个集群是一份完整、互备的数据。 |
node(节点) | 集群中的一个节点,一般只一个进程就是一个node。 |
shard(分片) | 分片,即使是一个节点中的数据也会通过hash算法,分成多个片存放,默认是5片。 |
Index(库) | 相当于mysql的database, 逻辑数据库,虽然物理上会被分多个shard存放,也可能存放在多个node中;动词表示插入。 |
Type(表) | 类似于mysql的table,其实更像面向对象中的class , 同一Json的格式的数据集合。 |
Document(一条数据) | 类似于mysql中的某个table的一条数据(row)、面向对象里的object |
Field(字段) | 相当于字段、属性 |
1.3 安装
docker pull elasticsearch:版本号
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-d elasticsearch:版本号
// 修改config/elasticsearch.yml
network.host: 0.0.0.0
// 修改config/jvm.options
-Xms64m
-Xmx128m
二、REST API
2.1 _cat
GET /_cat/nodes 查看所有节点
GET /_cat/health 查看es健康状态
GET /_cat/master 查看主节点
GET /_cat/indices 查看所有索引 show databases
2.2 增
索引一个文档(保存一条数据),保存在那个索引的那个类型下(保存在那个数据库的那张表下),制定用那个唯一的标识:PUT customer/external/1;在customer索引下的external类型下保存1号数据。注意es内存储的所有数据都是JSON文档。
PUT customer/external/1
PUT和POST做保存都可以
● POST新增,如果不指定id,会自动生成id,多次操作均为新增。指定id就会修改这个数据,并新增版本号;
● PUT可以新增也可以修改。PUT必须指定id;由于PUT需要指定id,我们一般用来做修改操作,不指定id会405报错。首次操作为新增,多次操作为更新。
2.3 删
DELETE customer/external/1 (删除文档)
DELETE customer (删除索引)
ES未提供删除直接删除类型的操作
2.4 改
PUT customer/external/1 (常用,不会对比原来的数据,多次重复提交未修改的数据,版本号、序列号改变)
{
"name":"john"
}
-------------------------------
POST customer/external/1/_update (会对比原来的数据,多次重复提交未修改的数据,版本号、序列号不变)
{
"doc":{
"name":"john"
}
}
-------------------------------
POST customer/external/1 (不会对比原来的数据,多次重复提交未修改的数据,版本号、序列号改变)
{
"name":"john"
}
2.5 查
//查询
GET customer/external/1
//乐观锁处理并发
GET customer/external/1?if_seq_no=0&if_primary_term=1
_bulk 批量操作
POST /customer/external/_bulk
// 操作的数据
{"index":{"_id":"1"}}
{"name":"john"}
{"index":{"_id":"2"}}
{"name":"mack"}
// 语法格式
{action:{metadata}}\n
{request bady}\n
{action:{metadata}}\n
{request bady}\n
复杂的批量操作场景
三、进阶检索
ES支持两种基本方式检索:一种是通过使用REST request URI 发送搜索参数(URI + 检索参数); 另一种是通过使用 REST request body 来发送(URI + 请求体)。
所有的搜索都要从_search开始。
// 检索bank下所有信息,包括type和 docs
GET bank/_search
// 请求参数方式检索
GET bank/_search?q=*&sort=account_number:asc
// 带请求体方式检索 Query DSL 风格
GET bank/_search
{
"query":{
"match_all":{}
},
"sort":[
{
"account_number":"asc"
},
{
"balance":"desc"
}
]
}
响应结果解释:
took - Elasticsearch 执行搜索的时间(毫秒)
time_out- 告诉我们搜索是否超时
_shards- 告诉我们多少个分片被搜索了,以及统计了成功/失败的搜索分片
hits- 搜索结果
hits.total- 搜索结果
hits.hits - 实际的搜索结果数组(默认为前10的文档)
sort- 结果的排序key(键)(没有则按 score 排序)
score 和 max_score- 相关性得分和最高得分(全文检索用)