index:一个数据库 type: 一张表 doucment:一个JSON mapping:约束,注意默认约束会是text类型,这个类型会被分词导致有些数据查不出来 文档id:也可以用UUID生成,采用base64算法;这样子即可保证高可用也可以保证高效率不必理会冲突和安全问题
找到单词元信息————ES单词词典(HashMap,正排)
通过单词作为key,找到单词的数据集合value(包含了,这个单词所有文档列表以及一些重要信息)
找到文档所在行————ES文档集合(倒排)
文档的插入过程,将文档(文章)进行分词,分别利用哈希找到不同的词汇,并在其文档列表中添加自己的文档id 词汇本身key——词汇对象value————文档(1)、文档(2)、文档(3)……,文本内部按照出现频率排序!
建立文章的时候,指定文章的词汇索引并统计其出现次数来实现倒排; 通过倒排索引,先搜索引区域,然后找到对应的doctID,去找到数据区域 倒排索引建立的时候使用标准化规则将关联词汇归位一个索引,词汇分析
利用数据压缩技术,让索引文件在内存中完成保存
Shards分片角色
node.master=true;node.data=fasle;负责管理集群范畴的变更,例如创建或删除索引,添加节点到集群或从集群删除节点;无需参与文档层面的变更和搜索+
data节点
node.master=fasle;node.data=true;持有数据和倒排索引
client節點
node.master=fasle;node.data=fasle;扮演一个负载均衡 的角色,将到来的请求路由到集群中的各个节点 在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的
Shards分片
将一个索引文件,拆分多个文件节点(索引分片),文件节点又是不同的物理机上实现高效率的分布式搜索;(默认分成5个)
Replicas副本
将每个文件节点(索引分片)分别进行冗余备份;分片又叫主索引:主管增删改;副本叫做从索引:主管查询,以及恢复数据的基础;官方建议分片节点的平方数 !!3个就是9,副本设为3
Shards分片路由算法
Ps:注意物理节点挂掉后,分片的虚拟节点仍然存在,因为此前的节点具有副本所以可以恢复数据到其他的物理节点上;由于文档分配在哪个虚拟节点上的是根据文档id,对分片数量求模算出来的 Shards的节点Ip定位:会根据请求中携带的参数“文档id”判断出该文档应该存储在具体哪一个shard中,然后通过元数据找到shard所在的node的ip地址
Shards分片查询需求原理
(1):客户端发送一个检索请求给node3,此时node3会创建一个空的优先级队列并且配置好分页参数from与size。 (2):node3将检所请求发送给index中的每一个shard(primary 和 replica),每一个在本地执行检索,并将结果添加到本地的优先级队列中; (3):每个shard返回本地优先级序列中所记录的_id与score值,并发送node3。Node3将这些值合并到自己的本地的优先级队列中,并做全局的排序(node 3将它们合并成一条汇总的结果),返回给客户端。