一 用途
ElasticSearch在速度和可扩展性方面都表现得很出色,而且还能够索引很多类型的内容,这就意味着其可用于多种用例。
- 应用程序的搜索
- 网站搜索
- 企业搜索
- 日志处理和分析
- 基础设置指标和容器监控
- 应用程序性能检测
- 地理空间数据分析和可视化
- 安全分析
- 业务分析
全文搜索属于是最常见的需求了,开源的ES是目前全文搜索的首选。可以快速的存储,搜索,分析海量的数据。维基百科,StackOverflow,Github都是采用它。
Elastic的底层是 Lucene。但是,我们没法直接使用 Lucene,必须自己写代码去调用它的接口,Elastic是 Lucene 的封装,提供了 REST API(天然的跨平台) 的操作接口,开箱即用。
1.1 index 索引
动词:相当于 MySQL 中的 insert
名词:相当于 MySQL 中的 Database
1.2 Type 类型
在 index 中,可以定义一个或者多个类型
类似于 MySQL 中的 table,每个类型的数据都放在一起
1.3 Document 文档
保存在某个索引(index)下面,某种类型(Type)的一个数据(Document),文档是JSON格式的,Document就像是MySQL中的某个Table里面的内容
二 Windows安装
安装 ElasticSearch 7.6.2 ,直接下载 Windows 版本,进入 bin 目录打开 bat 文件
安装 kibana 7.6.2,直接下载 Windows 版本,进入 bin 目录打开 bat 文件
三 初步检索
ElasticSearch 支持以HTTP请求发送的方式来进行操作ES
3.1 _cat
这个命令可以查看ES的一些信息
GET /_cat/nodes:查看所有的节点
GET /_cat/health:查看ES健康状况
GET /_cat/master:查看主节点
GET /_cat/indices:查看所有的索引(等同于MySQL的 :show databases)
3.2 保存一个文档
保存一个数据,保存在哪个索引下的哪个类型下面,指定用哪一个标识。
- 下面表示在customer索引下的external类型下保存1号数据
第一次发送这个请求,es的返回值是:PUT customer/external/1;
{
"name":"john Doe"
}
可以看到 URI 有三层,第一层是索引,第二层是类型,第三层是这个数据文档的id,如果发送请求不带id,则每次请求的结果都会产生一个新的id,且每次都是新增数据,如果带了id,则第二次之后为更新数据的操作。注意:PUT 是不允许不带id进行请求的,POST支持不带id请求。{
"_index": "customer",
"_type": "external",
"_id": "1",
"_version": 1,
"result": "created", // 第2次发送会变为updated
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}
3.3 查看文档
使用HTTP进行请求ES,返回结果为:GET customer/external/1
{
"_index": "customer", // 索引
"_type": "external", // 类型
"_id": "1", // id
"_version": 2, // 版本,操作过的次数
"_seq_no": 1, // 改动的次数,每次变动都会加一,可以做乐观锁操作
"_primary_term": 1, // 同上
"found": true,
"_source": { // 文档数据的真正内容
"name": "john markey"
}
}
3.4 更新文档
注意,(post发送请求,且最后带上 _update)这个更新数据的时候,如果值没有发生改变,那么 _verison,_seq_no 都不会发生改变。
带上 _update 不支持使用 PUT 请求
或者不需要加上 docPOST customer/external/_update
{
"doc":{
"name":"john new_1"
}
}
或者使用 PUT 请求POST customer/external/_update
{
"name":"john new_1"
}
PUT customer/external/_update
3.5 删除文档和索引
删除索引返回DELETE customer/external/1 // 删除文档
DELETE customer // 删除索引
{
"acknowledged": true
}
3.6 bulk批量API
请求体不是一个JSON,为两行组成一个数据(在 postman 中调用失败,可以使用 kibana)
复杂的案例,请求URI中没有指定类型和索引,在请求体中设置POST customer/external/_bulk
{"index":{"_id":"1"}}
{"name":"tom"}
{"index":{"_id":"2"}}
{"name":"jerry"}
POST /_bulk
{"delete":{"_index":"website","_type":"blog","_id":"123"}}
{"create":{"_index":"website","_type":"blog","_id":"123"}}
{"title":"my first blog post"}
{"index":{"_index":"website"},"_type":"blog"}