目录
文档的基本CURD和批量操作(update文档、index文档、get文档)
本小结主要讲解ElasticSearch的基本概念
索引
ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。
文档
文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示。文档由一个或多个域(Field)组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。
- ElasticSearch是面向文档的,文档是所有可搜索数据的最小单元,例如日志文件中的日志项,一部电影或者一张唱片的详细信息等
- 文档会被序列化城JSON格式,保存在ElasticSearch中
- 每个文档中都有一个Unique ID
REST API
为了对接不同的语言,ElasticSearch在设计之初都以REST API的方式进行展示,方便开发者进行对接。ElasticSearch的REST API主要包含文档的增删改查,Partial Update,Bulk Operation,搜索和聚合。
集群
集群是一个或多个节点(服务器)的集合,它们共同保存你的整个数据,并提供跨所有节点的联合索引和搜索功能。一个集群由一个唯一的名称标识,默认这个唯一标识的名称是"elasticsearch"。这个名称很重要,因为如果节点被设置为按其名称加入集群,那么节点只能是集群的一部分。
确保不要在不同的环境中用相同的集群名称,否则可能导致节点加入到错误的集群中。例如,你可以使用"logging-dev", "logging-test", "logging-prod"分别用于开发、测试和正式集群的名字。
节点
节点是一个单独的服务器,它是集群的一部分,存储数据,并参与集群的索引和搜索功能。就像集群一样,节点由一个名称来标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符(UUID)。如果不想用默认的节点名,可以定义任何想要的节点名。这个名称对于管理来说很重要,因为你希望识别网络中的哪些服务器对应于你的Elasticsearch集群中的哪些节点。
一个节点可以通过配置集群名称来加入到一个特定的集群中。默认情况下,每个节点都被设置加入到一个名字叫"elasticsearch"的集群中,这就意味着如果你启动了很多个节点,并且假设它们彼此可以互相发现,那么它们将自动形成并加入到一个名为"elasticsearch"的集群中。
一个集群可以有任意数量的节点。此外,如果在你的网络上当前没有运行任何节点,那么此时启动一个节点将默认形成一个单节点的名字叫"elasticsearch"的集群。
分片&&副本
一个索引可能存储大量数据,这些数据可以超过单个节点的硬件限制。例如,一个包含10亿条文档占用1TB磁盘空间的索引可能不适合在单个节点上,或者可能太慢而不能单独处理来自单个节点的搜索请求。
为了解决这个问题,Elasticsearch提供了将你的索引细分为多个碎片(或者叫分片)的能力。在创建索引时,可以简单地定义所需的分片数量。每个分片本身就是一个功能完全独立的“索引”,可以驻留在集群中的任何节点上。
分片之所以重要,主要有两个原因:
- 它允许你水平地分割/扩展内容卷
- 它允许你跨分片(可能在多个节点上)分布和并行操作,从而提高性能和吞吐量
在一个网络/云环境中随时都有可能出现故障,强烈推荐你有一个容灾机制。Elasticsearch允许你将一个或者多个索引分片复制到其它地方,这被称之为副本。
复制之所以重要,有两个主要原因:
- 它提供了在一个shard/node失败是的高可用性。出于这个原因,很重要的一个点是一个副本从来不会被分配到与它复制的原始分片相同节点上。也就是说,副本是放到另外的节点上的。
- 它允许扩展搜索量/吞吐量,因为搜索可以在所有副本上并行执行。
总而言之,每个索引都可以分割成多个分片。索引也可以被复制零(意味着没有副本)或更多次。一旦被复制,每个索引都将具有主分片(被复制的原始分片)和副本分片(主分片的副本)。在创建索引时,可以为每个索引定义分片和副本的数量。创建索引后,您可以随时动态地更改副本的数量,但不能更改事后分片的数量。
在默认情况下,Elasticsearch中的每个索引都分配了5个主分片和1个副本,这意味着如果集群中至少有两个节点,那么索引将有5个主分片和另外5个副本分片(PS:这5个副本分片组成1个完整副本),每个索引总共有10个分片。
文档的基本CURD和批量操作(update文档、index文档、get文档)
1. Create一个文档
- 支持自动生成文档Id和指定文档Id两种方式
- 通过PUT /users/_doc,系统会自动生成document Id
- 使用HTTP PUT user/_create/1创建时,URI中显示指定_create,此时如果该文档id已经存在,则提示操作失败
#create document,自动生成_id
POST users/_doc
{
"user" : "Mike",
"post_date" : "2020-07-11 23:25:40",
"message" : "I'm trying out Kinbana"
}
#create document,指定Id,如果Id已经存在,报错
POST users/_doc/1?op_type=create
{
"user" : "Jack",
"post_date" : "2020-07-11 23:38:40",
"message" : "I'm trying out Kinbana"
}
#create document,指定Id,如果Id已经存在,则会进行更新操作
POST users/_doc/2
{
"user" : "Merry",
"post_date" : "2020-07-11 23:39:40",
"message" : "I'm trying out Kinbana"
}
2. 查看一个索引
#查看users索引相关信息
GET users
#查看文档总数
POST users/_count
#查看索引文档总数
GET users/_count
倒排索引和正排索引
1. 正排索引(前向索引)
正排索引也称为"前向索引"。它是创建倒排索引的基础,具有以下字段。
(1)LocalId字段(表中简称"Lid"):表示一个文档的局部编号。
(2)WordId字段:表示文档分词后的编号,也可称为"索引词编号"。
(3)NHits字段:表示某个索引词在文档中出现的次数。
(4)HitList变长字段:表示某个索引词在文档中出现的位置,即相对于正文的偏移量。
由于一篇文章中的某些词可能出现多次,而且位置不同,而全文检索的本质要求是把这些位置标识出来,因此HitList中的每个命中都表示索引词在文档的某个位置中出现了一次,这个序列为单调递增序列。基于游程编码的方法,变升序序列为差分序列,采用前文提到的 Variable Byte Coding 方法编码可以大大压缩正排索引的HitList字段。
在正排索引中 LocalId 采用升序序列编号(假定编号采用自增1的方式递增),这为下面的计算创造条件。进行倒排索引的转化时,由于正排索引中 Lid 天然的有序性,因此在正排索引转化为倒排索引的创建过程中,自然可以保证倒排索引中每个词汇对应的文档编号也是有序的。
2. 倒排索引
倒排索引是一种以关键字和文档编号结合,并以关键字作为主键的索引结构。倒排索引分为两个部分。
(1)第1个部分:由不同索引词(index term)组成的索引表,称为"词典"(lexicon)。其中保存了各种中文词汇,以及这些词汇的一些统计信息(例如出现频率nDocs),这些统计信息用于各种排名算法(Ranking Algorithm)[Salton 1989;Witten 1994]
(2)第2个部分:由每个索引词出现过的文档集合,以及命中位置等信息构成,也称为"记录表"(posting file)或"记录列表"(posting list)
常见字段类型
ES常用的数据类型可分为3大类,核⼼数据类型、复杂数据类型和专⽤数据类型。
- 核心数据类型
字符串
数值型
日期类型
范围型
布尔
⼆进制
- 复杂数据类型
对象
数组
-
专用数据类型
ip