ES1_2索引

这篇文档总结ES中的基础数据结构,并介绍如何操作它们。

ES存储的基础概念 - 索引、映射和文档

几个概念的映射关系:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields

将 Type 类比为 Table 并不恰当,因为 ES 中一个索引下的多个类型共用相同的空间。

常用操作 - 索引(Index)

索引的定义

一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,实际上是组织数据的逻辑命名空间
在一个索引中,可以定义一种或多种类型

  • 作为名词,一个 索引 类似于传统关系数据库中的一个 数据库,是一个存储关系型文档的地方;

  • 作为动词,索引一个文档 就是存储一个文档到一个 索引 (名词)中以便它可以被检索和查询到,文档已存在时会被覆盖掉。

  • Index体现了逻辑空间的概念,每个索引都有自己的Mapping定义,用于定义包含的文档的字段名和字段类型;

  • Shard体现了物理空间的概念,索引中的数据分散在Shard上。

倒排索引

关系型数据库通过增加一个 索引,比如一个 B 树(B-tree)索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的。
倒排索引包含两个部分:

  • 单词词典(Term Dictionary)
    记录所有文档的单词,记录单词到倒排列表的关联关系
    单词词典一般比较大,可以通过B+树或哈希拉链法来实现,以实现高性能的插入和查询
  • 倒排列表(Posting List)记录了单词对应的文档结合,由倒排索引项组成
    倒排索引项由文档ID、词频TF(该单词在文档中出现的次数,用于相关性评分)、位置Position(单词在文档中分词的位置,用于语句搜索)、偏移Offset(记录单词的开始和结束位置,实现高亮显示)

类型 - Type

一个类型是索引的一个逻辑上的分类,代表一类相似的文档,类型由 名称(比如 user 或 blogpost)和 映射 组成。但是在 ES 6.0.0 以后,这个概念会被废弃
类型可以很好的抽象划分相似但不相同的数据,但由于 Lucene 的处理方式,类型的使用有些限制。Lucene 没有文档类型的概念,每个文档的类型名被存储在一个叫 _type 的元数据字段上。 当我们要检索某个类型的文档时, Elasticsearch 通过在 _type 字段上使用过滤器限制只返回这个类型的文档。
每个 Lucene 索引中的所有字段都包含一个单一的、扁平的模式。一个特定字段可以映射成 string 类型也可以是 number 类型,但是不能两者兼具(比如两个类型都有一个 name 字段,但是他们映射到不同的数据类型)。

查询索引

1
2
3
4
5
6
7
8
9
GET _cat/indices
# 查看indices,用do*来前缀匹配
get /_cat/indices/do*?v&s=index
# 查看状态为黄色的索引
get /_cat/indices?v&health=yellow
# 查看索引doc的相关信息
get doc
# 查看索引的文档总数
get doc/_count

创建

在 Elasticsearch 中,我们的数据是被存储和索引在 分片 中,而一个索引仅仅是逻辑上的命名空间, 这个命名空间由一个或者多个分片组合在一起。

1
2
3
4
5
6
7
8
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}

第一行指定了索引名/类型名/特定雇员id,其他所有的创建索引、指定每个属性的数据类型等工作都由后台默认设置完成。
如果你想禁止自动创建索引,你 可以通过在 config/elasticsearch.yml 的每个节点下添加下面的配置:

1
action.auto_create_index: false

删除

1
2
DELETE /index_one,index_two
DELETE /index_*

删除所有索引:

1
2
DELETE /_all
DELETE /*

如果想要避免意外删除所有数据带来的风险,可以在配置文件 elasticsearch.yml 中加入下面配置来禁止使用_all 和通配符删除索引:

1
action.destructive_requires_name: true