Elasticsearch
Elasticsearch 是高度可伸缩的开源全文搜索和分析引擎。 你可以即时存储、搜索并分析大容量数据。可靠的底层引擎和技术通常应对复杂的搜索场景和需求。
参考官方文档,初识 Elasticsearch 主要的 api 使用。
核心理念 Basic Concepts
- Near Realtime(NRT) 接近实时的搜索能力
Cluster & Node (集群和节点)
集群由多个节点组成,每个节点参与集群的索引和搜索操作,每个节点独一无二,并都指向同一个集群。
Index & Document (索引和文档)
Document 是被索引前的基础数据单位,一个 Index 索引将收集相同特征的文档集合,从而执行索引,搜索,更新等操作。
等相关操作
- Shards & Replicas 切片和备份
集群相关操作
以下操作均通过 Kibana > Dev Tools > Console 实践,当然也可以通过 Postman 等工具
健康检查
1 | GET /_cat/health?v |
status 标识集群的“健康”指标,通常 Green、Yellow、Red 分类。Yellow 是指数据可用但没有做备份等处理
Once that replica gets allocated onto a second node, the health status for this index will turn to green.
查询子节点信息
1 | GET /_cat/nodes?v |
查询索引列表
1 | GET /_cat/indices?v |
数据修改
所有的操作,遵循 Restful 规范,很容易理解
create 创建索引
1 | PUT /eminoda?pretty |
1 | GET /_cat/indices?v |
add 添加数据
1 | # /节点名称/文档标识/Id |
1 | { |
query 查询数据
1 | GET /eminoda/_doc/1 |
delete 删除索引、数据
1 | DELETE /eminoda/_doc/1 |
1 | DELETE /eminoda |
update 修改数据
id 不变,只改变 body 数据,就是更新数据
1 | PUT /eminoda/_doc/1 |
1 | # 注意是 update 状态 |
如果更改 id ,就相当于新添加数据;也可以交给 elasticsearch 自己生成 id(随机编码),改用 POST 方法,同时不指定 id
1 | POST /eminoda/_doc |
1 | { |
如果要查询上述数据,就要拿指定的 id
1 | GET /eminoda/_doc/BE2uy2oB3Cyw7jMvGdJt |
batch 多数据操作
批量添加数据
1 | # /节点名称/_bulk |
注意:不能漏掉 _type,不然会报如下错误
1 | "Validation Failed: 1: type is missing;2: type is missing;" |
批量复杂操作
1 | POST /eminoda/_bulk |
查询 Search
简单查询
1 | # /:index/_search |
1 | { |
条件查询
查询 index 中匹配所有的 document,并按照 _id 倒序
参数式:
1 | GET /eminoda/_search?q=*sort=_id:desc |
命令式(Query DSL):
1 | GET /eminoda/_search |
类似 sql,你也可以添加 类似 “分页” 的条件
1 | # 从第一条开始,查询两条数据 |
自定义数据 _source 显示特定字段(Field)
1 | GET /eminoda/_search |
只限制 age=11 的数据
1 | GET /eminoda/_search |
部分匹配 和 全文匹配
_source 如下:
1 | POST /eminoda/_bulk?pretty |
match 将搜索含有 first or Mike 的数据
1 | GET /eminoda/_search |
1 | "hits" : [ |
match_phrase 将一条都匹配不到,除非把 _id=1 的数据改为 first Mike
1 | GET /eminoda/_search |
bool 查询
- should or
- must and
- must_not all not
上述三个条件可以混用,match 规则也可多条
1 | GET /eminoda/_search |
filter 过滤查询
filter 从属于 bool 属性,和 must 并列
1 | GET /eminoda/_search |
aggregation 聚合查询
类似 sql 的 group by 操作,分组后按照分组数据进行倒叙输出
1 | SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC LIMIT 10; |
按照 nickname 字段分组,至多显示 10 组
1 | GET /eminoda/_search |
1 | { |
分组后,再按照 age 计算平均年龄,放入新字段 average_age,并且 nickname 分组的数据按照 average_age 升序
1 | GET /eminoda/_search |
1 | "aggregations" : { |