一 用途

ElasticSearch在速度和可扩展性方面都表现得很出色,而且还能够索引很多类型的内容,这就意味着其可用于多种用例。

  1. 应用程序的搜索
  2. 网站搜索
  3. 企业搜索
  4. 日志处理和分析
  5. 基础设置指标和容器监控
  6. 应用程序性能检测
  7. 地理空间数据分析和可视化
  8. 安全分析
  9. 业务分析

全文搜索属于是最常见的需求了,开源的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号数据
    1. PUT customer/external/1;
    2. {
    3. "name":"john Doe"
    4. }
    第一次发送这个请求,es的返回值是:
    1. {
    2. "_index": "customer",
    3. "_type": "external",
    4. "_id": "1",
    5. "_version": 1,
    6. "result": "created", // 2次发送会变为updated
    7. "_shards": {
    8. "total": 2,
    9. "successful": 1,
    10. "failed": 0
    11. },
    12. "_seq_no": 1,
    13. "_primary_term": 1
    14. }
    可以看到 URI 有三层,第一层是索引,第二层是类型,第三层是这个数据文档的id,如果发送请求不带id,则每次请求的结果都会产生一个新的id,且每次都是新增数据,如果带了id,则第二次之后为更新数据的操作。注意:PUT 是不允许不带id进行请求的,POST支持不带id请求。

    3.3 查看文档

    1. GET customer/external/1
    使用HTTP进行请求ES,返回结果为:
    1. {
    2. "_index": "customer", // 索引
    3. "_type": "external", // 类型
    4. "_id": "1", // id
    5. "_version": 2, // 版本,操作过的次数
    6. "_seq_no": 1, // 改动的次数,每次变动都会加一,可以做乐观锁操作
    7. "_primary_term": 1, // 同上
    8. "found": true,
    9. "_source": { // 文档数据的真正内容
    10. "name": "john markey"
    11. }
    12. }

    3.4 更新文档

    注意,(post发送请求,且最后带上 _update)这个更新数据的时候,如果值没有发生改变,那么 _verison,_seq_no 都不会发生改变。
    带上 _update 不支持使用 PUT 请求
    1. POST customer/external/_update
    2. {
    3. "doc":{
    4. "name":"john new_1"
    5. }
    6. }
    或者不需要加上 doc
    1. POST customer/external/_update
    2. {
    3. "name":"john new_1"
    4. }
    或者使用 PUT 请求
    1. PUT customer/external/_update

    3.5 删除文档和索引

    1. DELETE customer/external/1 // 删除文档
    2. DELETE customer // 删除索引
    删除索引返回
    1. {
    2. "acknowledged": true
    3. }

    3.6 bulk批量API

    请求体不是一个JSON,为两行组成一个数据(在 postman 中调用失败,可以使用 kibana)
    1. POST customer/external/_bulk
    2. {"index":{"_id":"1"}}
    3. {"name":"tom"}
    4. {"index":{"_id":"2"}}
    5. {"name":"jerry"}
    复杂的案例,请求URI中没有指定类型和索引,在请求体中设置
    1. POST /_bulk
    2. {"delete":{"_index":"website","_type":"blog","_id":"123"}}
    3. {"create":{"_index":"website","_type":"blog","_id":"123"}}
    4. {"title":"my first blog post"}
    5. {"index":{"_index":"website"},"_type":"blog"}