ElasticSearch索引详解(原理类型及设计使用)

ElasticSearch索引详解(原理类型及设计使用)-mikechen

ElasticSearch索引定义

ElasticSearch索引相当于MySQL的数据库,用于定义文档类型的存储和字段类型。

 

ElasticSearch索引模型

这里有一份简易的将Elasticsearch和关系型数据术语对照表:

关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)

Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)

  • 索引(Index):相当于数据库;
  • 文档类型(Type):相当于关系表;
  • 文档(Document):相当于关系表的数据行;
  • 字段(Field):相当于关系表的列;

 

Elasticsearch创建索引

Elasticsearch中创建索引,就相当于在关系型数据库中创建数据库。

可以通过 Elasticsearch 的 RESTFul API 来创建索引,语法格式如下:

PUT http://<ip>:<port>/<索引> + 索引配置
  1. PUT 请求:表示在服务器上创建对象,相当于SQL的Create命令;
  2. IP和端口号:就是ElasticSearch服务器和端口;
  3. 索引:需要创建的索引名字,相当于MySQL的表;
  4. 索引配置:数据格式是json,用于定义索引的配置信息:映射节(mappings)和配置节(settings);

比如:我要创建一个商品库的索引,示例:

PUT http://localhost:9200/goods

表示需要创建googs商品库的索引,相当于MySQL的商品库。

 

Elasticsearch索引类型

类型由名称 和 映射 ( mapping)组成,mapping就像数据库中的 schema 。

类型就是每个字段的数据类型,比如: string, integer 或 date等。

比如:你也可以在创建索引的时候,同时将索引的类型以及映射一并创建好。

示例:

"mapping": {
        "_doc": {
            "properties": {
                "goods_id": {
                    "type": "long"
                },
                "goods_name": {
                    "type": "text"
                },
                "picture_url": {
                    "type": "keyword"
                },
                "price": {
                    "type": "double"
                }
            }
        }

定义了一个 _doc 的类型,里面包含了 4 个类型字段,分别是:long、text、double,这就与MySQL的表的字段类似。

 

ElasticSearch索引原理

1.ElasticSearch索引过程

我们了解索引的写操作后可更新、索引、删除文档都是写操作,这些操作必须在主分片完全成功后才能拷贝至其对应的复制分片上。

默认情况下主分片等待所有备份完成索引后才返回客户端,大致分为如下三步:

ElasticSearch索引详解(原理类型及设计使用)-mikechen

第一步:客户从集群某节点写入数据发送请求;

第二步:节点 1 接受到请求后,使用文档_id 来确定文档属于分片 0。而分片0属于节点3,请求会被转到节点 3,分片 0 的主分片也分配到节点 3 上;

第三步:节点 3 在主分片上执行写操作,成功后将请求并行转发到节点1和节点 2 的副本分片上。

所有的副本分片都报告成功,节点3将向协调节点(节点 1)报告成功。

 

2.ElasticSearch倒排索引

倒排索引是搜索引擎的核心,搜索引擎的主要目标是在查找发生搜索条件的文档时提供快速搜索。

倒排索引是一种像数据结构一样的散列图,可将用户从单词导向文档或网页,它是搜索引擎的核心.

如下图所示:

ElasticSearch索引详解(原理类型及设计使用)-mikechen

倒排索引其主要目标:是快速搜索从数百万文件中查找数据。

倒排索引是区别于正排索引的概念:

正排索引:是以文档对象的唯一 ID 作为索引,以文档内容作为记录。

倒排索引:Inverted index,指的是将文档内容中的单词作为索引,将包含该词的文档 ID 作为记录。

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法