《Elasticsearch权威指南》读书笔记

91 阅读9分钟

第1章 快速入门

1.1 基本概念

Elasticsearch是一个近实时(Near Real Time)的数据搜索和分析平台。从索引文档到可搜索文档都会有一段微小的延迟(通常是1秒以内)。

集群

集群是一个或多个节点的集合,这些节点共同拥有完整的数据,并跨节点提供联合索引、搜索和分析功能。

节点

节点是一个Elasticsearch的运行实例,也就是一个进程。

索引

索引是具有某种相似特性的文档集合。

文档

文档是可以被索引的基本信息单元。

分片和副本

索引可能会存储大量的数据,导致数据可能超出单个节点的硬件限制或者速度太慢。
Elasticsearch将索引水平切分成多段(称为分片,shard)。每个分片都是一个具有完整功能的独立“索引”,可以分布在集群中的任何节点上。
分片的重要作用:

  1. 可以水平拆分数据,实现大数据存储和分析
  2. 可以跨分片(可能在多个节点上)进行分发和并行操作,从而提高性能和吞吐量

副本:分片的拷贝
副本的重要作用:

  1. 副本在分片或节点发生故障时提供高可用性。副本永远不会分配到复制它的原始主分片所在的节点上。 也就是分片和对应的副本不会在同一节点上,防止机器发生故障时会同时丢失,起不到容错的作用。
  2. 可以提高搜索性能和水平扩展吞吐量,因为可以在副本上进行搜索
    总之,一个索引可以有多个分片,一个分片可以有0个或者多个副本。
    分片的数量理论上是不可变的,除非重建索引
    默认情况下,每个索引都有1个主分片和1个副本。
    每个分片都是一个完整的Lucene索引

分片和副本是Elasticsearch 实现分布式、水平扩展、高并发、高容错性功能的核心。

1.3 开始使用集群

检查集群的运行状况: Get _cat/health
集群状态有三种颜色:

  1. 绿色: 一切正常
  2. 黄色:所有数据都可用,但某些副本尚未分配(集群正常工作)
  3. 红色:某些数据不可用(集群只有部分功能正常工作)
    注意:当集群为红色时,可用的分片继续提供搜索请求,但需要尽快修复它,因为存在尚未分配的分片
1.3.2 列出索引信息

GET /_cat/indices?v

1.3.3 创建索引

PUT /customer

1.3.4 索引和查询文档

GET /customer/_doc/1?pretty

1.3.5 删除索引

DELETE /customer

1.4修改数据

Elasticsearch进行更新时,会删除旧文档,然后索引到一个新文档。

1.4.2 删除文档

DELETE /customer/2

1.4.4 批量操作

POST /customer/_bulk {"index":{"id":"1"}} {"name":"John Doe"} {"index":{"id":"2"}} {"name":"Jane Doe"}
批量操作API不会因为其中一个操作失败而失败。如果一个操作失败,它将继续处理后面的操作。

查询语句

默认都是:GET/index/_search

1.基本查询

1.1 Match Query
匹配查询是最常用的查询类型之一,用于全文搜索。

{ "query":{ "match":{ "title":"平安" } } }

1.2 Term Query
用于精确匹配字段的值,常用于结构化数据查询。

这里的结构化字段指的是:数值字段,日期字段,布尔字段,关键词字段(keyword)

{ "query":{ "term":{ "title":"少儿平安福20" } } }

1.3 Range Query
用于范围查询,可以查找数值、日期或字符串范围内的文档。

{
    "query": {
        "range": {
            "fee": {
                "gte": 2900
            }
        }
    },
    "sort": [
        {
            "fee": {
                "order": "desc"
            }
        }
    ]
}

2.复合查询

2.1 Bool query

布尔查询用于组合多个查询条件,可以包含 must、must_not、should 和 filter 子句。

{
    "query": {
        "bool": {
            "should": [
                {
                    "match_phrase": {
                        "title": "健康"
                    }
                }
            ],
            "must": [
                {
                    "match": {
                        "riskType": "MAJOR_DISEASE"
                    }
                }
            ],
            "filter": [
                {
                    "term": {
                        "enable": true
                    }
                }
            ],
            "must_not": [
                {
                    "match": {
                        "company": "君龙人寿"
                    }
                }
            ]
        }
    },
    "sort": [
        {
            "fee": {
                "order": "desc"
            }
        }
    ]
}
      

3.聚合查询

聚合查询用于对数据进行分组、统计、计算等操作。 1.Terms Aggregation

{
    "aggs": {
        "aggs_by_company": {
            "terms": {
                "field": "company.keyword"
            }
        }
    }
}

返回结果:

{
    "took": 107,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 43,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [省略这块]
    },
    "aggregations": {
        "aggs_by_company": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 16,
            "buckets": [
                {
                    "key": "平安人寿",
                    "doc_count": 6
                },
                {
                    "key": "平安健康",
                    "doc_count": 4
                }
            ]
        }
    }
}

第2章 安装部署

第3章 API规范

第4章 操作文档

单文档:

  • Index API
  • Get API
  • Delete API
  • Update API

多文档:

  • Multi Get API
  • Bulk API
  • Delete By Query API
  • Update By Query API
  • Reindex API 所有的CRUD API都是单索引。index参数接受一个索引名(或一个指向单个索引的别名)。
4.1 读写文档

Elasticsearch 中的每个索引都分为多个分片,每个分片可以有多个副本,这些副本称为复制组,在添加或者删除文档时必须保持同步。如果不这样做,将导致从一个副本中读取的数据与从另一个副本中读取的数据表现出截然不同的结果。
保持主分片和副本间,两两副本间的数据同步并提供读取服务的过程,我们称之为数据复制模型。
4.1.1 基本写模型
Elasticsearch的每个索引操作首先使用路由(通常基于文档ID)解析到一个复制组。一旦确定了复制组,该操作将在内部转发到该组的当前primary。primary负责验证操作并将其转发到其他replica。由于replica可以离线,因此不需要primary复制到所有的replica(Elasticsearch维护一个接受操作的replica列表,称为同步副本组)。

primary遵循以下基本流程:

  1. 验证传入操作,如果结构无效则拒绝该操作。
  2. 在本地执行操作,索引或者删除相关文档。还将验证字段的内容,并在需要时拒绝。(例如,关键字值对于Lucene中的索引而言太长了)
  3. 将操作并行转发到当前同步副本组中的每个副本
  4. 一旦所有副本都成功地执行了操作并对primary作了响应,primary就确认完成了请求并返回给用户

4.1.2 写流程错误处理

  1. 如果primary本身发生故障,primary所在的节点将向master节点发送相关的信息。
  2. 索引操作将等待(默认情况下最多1分钟),master将其中一个replica提升为primary。
  3. 将该操作转发到新的primary处理
  4. 同时,master还监视节点的运行状况,并可能决定主动降级primary为replica

4.1.3 基本读模型

  1. 协调节点 (Coordinating Node) 接收查询请求并解析查询语句
  2. 协调节点将查询请求分发到所有包含目标索引分片的节点
  3. 每个节点上的分片独立执行查询操作
  4. 各分片将查询结果返回给协调节点,协调节点将分片的结果进行整合,并返回给客户端
4.2索引API

索引API在特定索引中添加或更新JSON文档,使其可搜索。

PUT /twitter/_doc/1
{
    "user":"kimchy"
}

默认情况下,当索引操作成功返回时,有可能一些replica还没有开始或完成,因为只要primary成功执行,就会返回。

4.3 GET API

查询id=1的文档
GET /twitter/_doc/1

还可以使用head检查文档是否存在:
HEAD /twitter/_doc/1

4.4 删除API

删除API(DELETE)允许根据特定文档的ID从其中删除JSON文档。
DELETE /twitter/_doc/1

4.5 查询删除

查询删除API(_delete_by_query)是对每个与查询匹配的文档执行删除操作。

 {
    "query": {
        "match": {
            "message": "some message"
        }
    }
}
    
4.6 更新API

更新API(_update)允许根据提供的脚本更新文档

POST /test/_doc/1
{
    "doc":{
        "name":"new_name"
    }
 }
4.7 查询更新

_update_by_query API 的主要功能是基于查询条件批量更新文档。它会查找符合查询条件的所有文档,然后对这些文档执行更新操作。

POST /index_name/_update_by_query
{
 "query": {
   "match": {
     "field": "value"
   }
 },
 "script": {
   "source": "ctx._source.field = 'new_value'",
   "lang": "painless"
 }
}

第5章 搜索数据

第6章 聚合

第7章 查看API

_cat后不跟任何子节点,返回的结果是目录,也就是可用的URL节点。
这个功能非常有用,当忘记某个接口时可以先执行这个接口。

GET /_cat/

image.png

第8章 集群API

节点分类

  1. 主节点(Master Node)
    主节点在Elasticsearch中仍然负责集群的管理和协调工作,包括:
  • 集群状态管理:维护整个集群的状态信息,包括索引的创建和删除、节点的加入和离开等操作。
  • 节点选举:通过选举机制选出新的主节点,确保集群的高可用性。
  • 索引管理:处理索引的分片分配和副本分片的分配策略,确保数据的均衡存储和高可用性。
  1. 数据节点(Data Node)
    数据节点存储实际的数据并执行文档的索引和搜索操作,其主要功能包括:
  • 数据存储:存储索引中的实际文档数据。
  • 文档索引和搜索:处理来自客户端的索引请求(如PUT或POST请求)和搜索请求(如GET请求)。
  1. 协调节点(Coordinating Node)
    协调节点主要负责处理客户端请求,其功能包括:请求路由和结果聚合

  2. 索引预处理节点(Ingest /ɪnˈdʒest/ Node)
    Ingest节点用于数据预处理,其主要功能包括:

  • 数据预处理:在数据索引到Elasticsearch之前执行转换、过滤、增强或重构等预处理操作。
  • 管道处理:使用管道(Pipeline)定义和执行预处理操作。

第9章 索引API

9.1.1 索引设置

定义分片数量为3,每个分片的副本数量为2

PUT /twitter_1
{
    "settings":{
        "index":{
            "number_of_shards":3,
            "number_of_replicas":2
        }
    }
}
9.1.3 映射

映射的功能是完成字段的定义,包括数据类型,存储属性,分析器等。
PUT test

{
    "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 2
    },
    "mappings": {
        "properties": {
            "field1": {
                "type": "text"
            }
        }
    }
}

注意,这里要用PUT,不能用post

删除索引

DELTE /twitter

判断索引是否存在

HEAD /twitter

映射
{
    "mappings": {
        "properties": {
            "comment": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            },
            "company": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            },
            "content": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            },
            "enable": {
                "type": "boolean"
            },
            "fee": {
                "type": "long"
            }
        }
    }
}

数据类型

  1. 数字类型:long,integer,short,byte,double,float,half_float,scaled_float
  2. 布尔类型:boolean
  3. 日期类型: date
  4. 关键字:keyword,不再分词,检索时只能用精确搜索
  5. 文本类型:text
  6. 地理位置类型: geo