ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库
- 1个index包括多个分片shard,副本的数据是准实时(near read-time)的,读取的时候主分片和副本分片都可以读,每一个节点都是coordinate node(协调节点)
- 分片越多,搜索越慢
- ES数据存储的的最小单元, 一个Shard本质上是一个Lucene Index, 由一堆 Segment的集合加上commit point组成
内置的数据结构:
- Inverted Index 倒排索引
- 1.1 一个有序的数据字典term Dictionary(包括单词Term和它出现的频率count), ES为了能快速找到某个term,将所有的term排序,二分法查找term,logN的查找效率,如果Term Dictionary很大,term dictionary会很大,故采用Term Index(前缀树)实现, term index不需要存下所有的term,而仅仅是他们的一些前缀与Term Dictionary的block之间的映射关系,Term Index 通过树结构快速找到关键词前缀所在的下一级索引(Term Dictionary)中的偏移,再在第二级索引中定位到完整的关键词,最终在第三级索引中找到对应的 docid,大大降低了随机磁盘操作。
- 1.2 与单词Term对应的Postings List(即存在这个单词的文件DocumentId:Position),是一个跳跃表结构. 在多索引联合查询时, 首先对每个索引单独查询, 查找对应存储docid列表构成的跳跃表结构. 然后小的Postings List根据doc id去驱动大的Postings List.
文件存取
当ElasticSearch 索引一个文件的时候,会为文件建立相应的缓存,并且会定期(每秒)刷新这些数据,然后这些文件就可以被搜索到
容灾
- 有节点下线,但是所有数据节点都至少有一个都存活,则从节点可以上升为主节点,为黄色
- 部分主节点不存活,也能查询处部分index信息但是不完整,为红色
写入
- 只能写打开的分段(为了避免冲突合并)
- 删除是假删除,也是往打开的分段中写
- 分段大小超过一定阈值,会触发分段合并
- 小分段合并成大分段,可以提升查询,但是需要创建大分段,然后把小分段放入,会产生资源消耗.
什么是分析?
- 字符过滤: 使用字符过滤器转变字段,如大写转小写、& 转 and
- 分词过滤器TokenFilter: 使用分词过滤器,转变每个分词,包括(小写,分词器,同义词)
- 分词索引: 把这些分词和指向文档的关系放进索引
- 中文分词器选用ik

配置分析器
- 创建索引的分析器
- 使用template配置分析器

查询的流程
- 客户端请求发送到集群的某个节点上。集群上的每个节点都是coordinate node(协调节点)
- 然后协调节点将搜索的请求转发到所有分片上(主分片和副本分片都行)
- 每个分片将自己搜索出的结果(doc id)返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果。
- 接着由协调节点根据doc id去各个节点上拉取实际的document数据,最终返回给客户端
客户端写入数据流程
- 首先客户端根据配置的连接节点,通过轮询方式连接到一个coordinate节点。
coordinate节点不是master/client/data节点一个维度的描述,它就是指处理客户端请求的节点。这个描述和cassandra的coordinate节点是一个概念。集群中所有的节点都可以是coordinate节点。 - coodinate节点通过hash算法计算出数据在shard1上shard = hash(doc_id) % (shards),然后根据节点上维护的shard信息,将请求发送到node1上。
- node1对索引数据进行校验,然后写入到shard中。具体细节见下一节写入到shard。
- 主节点数据写入成功后,将数据并行发送到副本集节点Node2,Node3。
- Node2,Node3写入数据成功后,发送ack信号给shard1主节点Node1。
- Node1发送ack给coordinate node, coordinate node发送ack给客户端。
写入Shard
- 数据写入到内存buffer,同时写入到数据到translog buffer
- 每隔1s数据从buffer中refresh到FileSystemCache中,生成segment文件,一旦生成segment文件,就能通过索引查询到了
- refresh完,memory buffer就清空了。
- 每隔5s中,translog 从buffer flush到磁盘中
- 定期/定量从FileSystemCache中,结合translog内容flush index到磁盘中。做增量flush的。
Elasticsearch通过索引存储数据,每个索引包含多个分片。分片由一系列分段组成,利用倒排索引提高检索效率。客户端请求经协调节点转发至各分片,收集结果后返回。



378

被折叠的 条评论
为什么被折叠?



