开始elasticsearch之前先说一下Lucene的,elasticsearch封装了Lucene的(全文搜索引擎)。
先内容建立索引,对在索引进行搜索的过程叫做全文检索。创建索引很慢但是使用时很快,所以创建索引是有必要的。对数据量大,数据结构不固定的数据用全文检索。
流程
-
创建索引
- 获得文档
- 构建文档对象
- 分析文档(分词)
- 创建索引
-
索引库
索引库中有索引和原文件
-
查询索引
- 用户查询接口
- 创建查询
- 执行接口
- 渲染结果(执行完毕返回1)
文档对象(对象)
文档对象中域包括文件名称,文件大小,文件内容,文件路径...每个文件可以有多个域(场),不同的文档(文档)可以有不同的域(场)同一个文档(文档)可以有相同的域(场),每一个文档都有一个唯一的编号(ID)。
分析文档
分析的过程是提取单词,将字母转成小写,去标点符号去除停用词等过程生成最终的词汇单元。每个单词是一个长期,不同域中拆分出来的单词是不同的术语,术语中包括俩部分,一部分是域名,一部分是单词的内容(键值)。
创建索引
第一部分:索引
第二部分文档对象
索引一样则数量增加,返回对应的文档并根据唯一编号找文档。
倒排索引
根据内容(词语)找文档叫倒排索引结构,也叫反向索引结构,包括索引和文档两部分。
索引既词汇表,它的规模较小,而文档集合较大。
elasticsearch
- 索引是ElasticSearch存放数据的地方,可以理解为关系型数据库中的一个数据库。
- 类型用于区分同一个索引下不同的数据类型,相当于关系型数据库中的表
- 文档是ElasticSearch中存储的实体,类比关系型数据库,每个文档相当于数据库表中的一行数据。
- 文档由字段组成,相当于关系数据库中列的属性,不同的是ES的不同文档可以具有不同的字段集合。
对比关系型数据库:
-
节点与集群
ElasticSearch是一个分布式全文搜索引擎,既可以做为一个独立的搜索服务器工作,也可以使用多台服务器同时运行,这样就构成了一个集群(cluster),集群的每一个服务器称为一个节点(node).
当数据量比较大的时候,受RAM、硬盘容量的限制,同时一个节点的计算能力有限。可以将数据切分,每部分是一个单独的lucene索引,成为分片(shard)。每个分片可以被存储在集群的不同节点上。当需要查询由多个分片构成的索引时,ElasticSearch将查询发送到每个相关的分片,之后将查询结果合并。过程对应用透明,无须知道分片的存在。
副本是对原始分片的一个精确拷贝,原始分片成为主分片。对索引的所有操作都直接作用在主分片上,每个主分片可以有零个或多个副分片。主分片丢失,集群可以将一个副分片提升为主的新分片。
es中shard(分片)就是lucene的一个实例,可以处理一个单独的请求,es的数据由几个shard分担,每个shard的数据都不一样,几个shard加起来是一个完整的index,创建index的时候shard是固定的,replica是可以修改的。
副本的作用是备份碎片的数据,提高容错,如果一个碎片宕机了就会启用复制的数据来,当数据添加到一个碎片的时候会添加到对应的副本中。但是碎片和副本不能在同一个节点(服务器)中,如果在同一节点宕机以后则碎片和复制品都不能用了,这样就备份没有意义。
如果一个节点中没有备份,在水平扩容添加节点的时候,会自动把第一个节点的备份(复制品)加到第二个节点中。
同一个索引中可以有不同类型的文档,但是建议同一索引使用相同的类型,比如甲类型和乙类型都在同一索引,因为遇到并发时一端访问一个碎片的甲类型,另一端也在访问同一个shard的B类型,这样就忙不过来,处理慢了。
es6.0开始,一个索引只能有一个类型
路由
一个索引由多个分片构成,当es要添加(修改、删除)一个文档时,es决定文档在哪个分片存储,这个过程就是路由