ElasticSearch索引定义
ElasticSearch索引相当于MySQL的数据库,用于定义文档类型的存储和字段类型。
ElasticSearch索引模型
这里有一份简易的将Elasticsearch和关系型数据术语对照表:
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
- 索引(Index):相当于数据库;
- 文档类型(Type):相当于关系表;
- 文档(Document):相当于关系表的数据行;
- 字段(Field):相当于关系表的列;
Elasticsearch创建索引
在Elasticsearch中创建索引,就相当于在关系型数据库中创建数据库。
可以通过 Elasticsearch 的 RESTFul API 来创建索引,语法格式如下:
PUT http://<ip>:<port>/<索引> + 索引配置
- PUT 请求:表示在服务器上创建对象,相当于SQL的Create命令;
- IP和端口号:就是ElasticSearch服务器和端口;
- 索引:需要创建的索引名字,相当于MySQL的表;
- 索引配置:数据格式是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索引过程
我们了解索引的写操作后可更新、索引、删除文档都是写操作,这些操作必须在主分片完全成功后才能拷贝至其对应的复制分片上。
默认情况下主分片等待所有备份完成索引后才返回客户端,大致分为如下三步:
第一步:客户从集群某节点写入数据发送请求;
第二步:节点 1 接受到请求后,使用文档_id 来确定文档属于分片 0。而分片0属于节点3,请求会被转到节点 3,分片 0 的主分片也分配到节点 3 上;
第三步:节点 3 在主分片上执行写操作,成功后将请求并行转发到节点1和节点 2 的副本分片上。
所有的副本分片都报告成功,节点3将向协调节点(节点 1)报告成功。
2.ElasticSearch倒排索引
倒排索引是搜索引擎的核心,搜索引擎的主要目标是在查找发生搜索条件的文档时提供快速搜索。
倒排索引是一种像数据结构一样的散列图,可将用户从单词导向文档或网页,它是搜索引擎的核心.
如下图所示:
倒排索引其主要目标:是快速搜索从数百万文件中查找数据。
倒排索引是区别于正排索引的概念:
正排索引:是以文档对象的唯一 ID 作为索引,以文档内容作为记录。
倒排索引:Inverted index,指的是将文档内容中的单词作为索引,将包含该词的文档 ID 作为记录。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》