ES分布式搜索引擎

ES分布式搜索引擎

  1. 当我们要查找一个数据时,多个文本中的某个字段,可以遍历所有的文本然后查询,但是效率很低

  2. 故可以使用倒排索引,先对每个文本进行分词,得到每个词项,然后记录每个词项在哪些文本中出现过,就得到了一个倒排索引,其中某一列是所有的词项字典,每个词项有一个Posting List保存该词项在哪些文本中出现过,记录文本IDES分布式搜索引擎_第1张图片

  3. 因为以上的倒排索引是在磁盘中的,故每次查询时还要进行IO操作,且仍要遍历所有的词项来找到对应的id,故可以将词项按照字典序生成一个前缀树,放在内存中,每个节点表示当前前缀对应的词项在磁盘中的位置,该结构就是term index,用来在内存中快速检索词项的位置

  4. 倒排索引中存放的只是某个词项出现过的文本id,找到id后还要把文本进行处理,故要使用shord Field 来存放每个文档的内容,然后根据倒排索引的id去找对应的文档内容ES分布式搜索引擎_第2张图片

  5. 有时候我们不仅要对文档中的词项进行查询,还会对文档内部的某些时间或者价值等进行排序,故可以额外使用一些空间来对每个文档中根据一些字段进行排序,这就是Doc values

  6. 以上四个数据结构:倒排索引、term index、shord Field和Doc values共同构成一个segment,作为完成数据检索的最小单元ES分布式搜索引擎_第3张图片

  7. 而每当要写入一个新的文档时,如果在原有的segment基础上进行加入,则会导致数据结构完全改变,故规定每次写入时不会改变已经存在的segment,而是创建一个新的segment,然后并发读取,且为了使得segment不会过多,会定期对segment进行合并,以上的segment集合就是一个单机的lunece,这就是单机下的数据检索

  8. 单机lunece当并发量很大时会宕机,故可以根据index name来划分不同的lunece,并且将lunece进行分片,划分为更小的lunece,并且为了避免单机并发请求过大,可以将不同的shard部署在不同的服务器上,每个服务器就是一个node,且为了保证可靠性,可以对每个shared存放副本,且每个Node可以有不同的角色,可以用来存放数据,也可以用来处理请求等等

  9. 以上就是一个分布式的数据检索系统架构,即ES

你可能感兴趣的:(Java实习工作,学习日记,搜索引擎,elasticsearch,分布式,java,JUC)