ES核心概念
ElasticSearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引,搜索、排序、过滤。
es与关系型数据库对比
Elasticsearch | 关系型数据库(MySql) |
---|---|
索引(indices) | 数据库(database) |
类型(Types) | 表(tables) |
文档(Documents) | 行(rows) |
字段(fields) | 列(columns) |
elasticsearch(集群)中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包含多 个文档(行),每个文档中又包含多个字段(列)。
物理设计:
elasticsearch 在后台把每个索引划分成多个分片,每分分片可以在集群中的不同服务器间迁移
逻辑设计:
一个索引类型中,包含多个文档,比如说文档1,文档2。 当我们索引一篇文档时,可以通过这样的一各顺序找到 它: 索引 > 类型 > 文档ID ,通过这个组合我们就能索引到某个具体的文档。 注意:ID不必是整数,实际上它是个字 符串。
ES相关概念
索引
索引是映射类型的容器,Elasticsearch的索引是一个非常大的文档的集合。一个索引由一个名字来标识(必须全部是小写字母),当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。索引类似于关系型数据库中Database的概念。在一个集群中,可以定义任意多的索引。
类型
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。类型类似于关系型数据库中Table的概念。
在7.X版本中,一个index下只能存在一个type,创建index时可不指定type文档
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。
文档有几个 重要属性 :
- 自我包含,一篇文档同时包含字段和对应的值,也就是同时包含 key:value!
- 可以是层次型的,一个文档中包含自文档,复杂的逻辑实体就是这么来的!
- 灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用,
在elasticsearch中,对于字段是非常灵活的,有时候,我们可以忽略该字段,或者动态的添加一个
新的字段。
倒排索引
elasticsearch使用的是一种称为倒排索引的结构,采用Lucene倒排索引作为底层。这种结构适用于快速的全文搜索, 一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。
例如以下文档:
id | 文档内容 |
---|---|
1 | php是世界上最好的语言 |
2 | 汉语是世界上使用最广泛的语言 |
为了创建倒排索引,我们首先要将每个文档拆分成独立的词(或称为词条或者tokens),然后创建一个包含所有不重 复的词条的排序列表(去除无意义的词,比如:'是',的'),然后列出每个词条出现在哪个文档 :
单词 | 文档1 | 文档2 |
---|---|---|
php | √ | × |
世界 | √ | √ |
最好 | √ | × |
语言 | √ | √ |
汉语 | × | √ |
使用 | × | √ |
最广泛 | × | √ |
基于以上结构构建的倒排索引结果如下(这里省去了位置信息):
单词 | 文档id列表 |
---|---|
php | 1 |
世界 | 1,2 |
最好 | 1 |
语言 | 1,2 |
汉语 | 2 |
使用 | 2 |
最广泛 | 2 |
当我们试图搜索 '世界' 的时候,只需要查看单词 这一列,然后获取相关文档ID即可返回。