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 | GET _cat/indices |
创建
在 Elasticsearch 中,我们的数据是被存储和索引在 分片 中,而一个索引仅仅是逻辑上的命名空间, 这个命名空间由一个或者多个分片组合在一起。
1 | PUT /megacorp/employee/1 |
第一行指定了索引名/类型名/特定雇员id,其他所有的创建索引、指定每个属性的数据类型等工作都由后台默认设置完成。
如果你想禁止自动创建索引,你 可以通过在 config/elasticsearch.yml 的每个节点下添加下面的配置:
1 | action.auto_create_index: false |
删除
1 | DELETE /index_one,index_two |
删除所有索引:
1 | DELETE /_all |
如果想要避免意外删除所有数据带来的风险,可以在配置文件 elasticsearch.yml 中加入下面配置来禁止使用_all 和通配符删除索引:
1 | action.destructive_requires_name: true |