Table of Contents

  1. Apache Lucence简介
    1. 为什么elasticsearch创始人觉得使用lucene而不是自己开发全文检索库?
    2. lucene总体架构
    3. 倒排索引
    4. 段(segment)
    5. 段合并
    6. 文档数据是如果转化为倒排索引的?
  2. ElasticSearch简介
    1. 简介
    2. 索引
    3. 文档
    4. 类型
    5. 节点
    6. 集群
    7. 分片
    8. 副本
    9. es架构背后的关键概念
    10. es工作流程
      1. 启动过程
      2. 故障检测
      3. 索引数据
      4. 查询操作

elasticsearch是一个可用于构建搜索应用的成品软件,区别去lucene这种中间件

Apache Lucence简介

为什么elasticsearch创始人觉得使用lucene而不是自己开发全文检索库?

可能是因为lucene的成熟,高性能,可扩展以及强大的功能,得到创始人的青睐,lucene有很多扩展功能,如 多语言处理,拼写检查,高亮显示等

lucene总体架构

文档(document),字段(field),词项(term),词条(token)

倒排索引

lucene将写入索引的所有信息组成一种名为倒排索引的结构,倒排索引是面向词项而不是面向文档,实际的lucene创建的索引更为复杂,也更先进,因为索引中还储存和很多其他信息,如词向量(为单个字段创建的小索引,储存改字段中所有的词条) 各字段的原始信息,文档删除标记

段(segment)

每个段只会被创建一次但是会被查询多次,索引期间,段经创建就不会被修改,例如,文档被删除以后,删除信息被单独的保存在一个文件中,而段本身并没有修改

段合并

多个段合并在一起,要么是强制执行,要么是有lucene的内在机制决定在某个时刻执行,段合并非常消耗I/O,且合并期间有些不再使用的信息也将被清理掉,例如:被删除的文档,不要强制执行段合并,只需要配置段合并策略,剩余的事情Lucene会自行搞定

文档数据是如果转化为倒排索引的?

这个转换的过程称为分析(analysis),分析由分析器来执行,分析器由分词器(tokenizer)过滤器(filter)和字符映射器组成(character mapper),分词器用来切割词条,过滤器可以移除,修改词条流中的词条,甚至可以创造新的词条,字符映射器用于调用分词器之前的预处理操作,比如HTML文本去标签

ElasticSearch简介

简介

elasticsearch是一个可用于构建搜索应用的成品软件,区别去lucene这种中间件

索引

es将数据储存在一个或多个索引中,就像是sql领域的数据库,es索引可能由一个或多个lucene索引构成,具体细节由es的索引分片,复制机制及其配置决定

文档

是es时间中的主要实体,文档之间可能由各自不同的字段集合,且文档并没有固定的模式或强制的结构,这些规则也适用于lucene文档,事实上,es的文档最后都储存为lucene文档了

类型

es每个文档都有与之对应的类型(type)定义,这允许用户在一个索引中存储多种文档类型,并为不同文档类型提供不同的映射

节点

单个es服务器实例称为节点

集群

多个节点来协同处理

分片

es将数据散步到多个物理lucene索引上,这些索引称为分片,而散步分片的过程叫做分片处理(sharding),es会自动完成分片处理,并且让这些分片呈现出一个大索引的样子

副本

为每个分片创建冗余的副本,处理查询时可以把这些副本用作最初的主分片

es架构背后的关键概念

合理的默认配置,默认的分布式工作模式,对等架构可以避免单点故障,易于向集群扩充节点

es工作流程

启动过程

使用广播技术来发现同一个集群中的其他节点并与他们链接,集群中会有一个节点被选为管理节点,该节点复制集群的状态管理以及在集群拓扑变化时做出反应,分发索引分片到集群的相应节点上

故障检测

对每一个丢失的主分片,一个新的主分片将会从原来的主分片的副本中脱颖而出,新分片和副本的放置策略是可配置的,用户可以根据具体需求进行配置

索引数据

索引操作只会发生在主分片上,当把一个索引请求发送至某节点时,如果该节点没有对应的主分片或者只有副本,那么这个请求会被转发到拥有正确的主分片的节点

查询操作

查询并不是一个简答的,单步骤的操作,一般来说,查询分为两个阶段,分散阶段和合并阶段

(注:内容整理自《深入理解Elasticsearch》)