1. 基础定义
什么是elasticsearch?
开源的分布式搜索引擎,在海量数据中实现搜索、日志统计、分析、系统监控等功能
特点:
- 使用RESTful API,天然兼容多语言开发。
- 支持水平横向扩展节点,增加节点实现负载均衡及增强集群可靠性。
- 面向文档:不使用“表”而使用“文档”来存储数据。
- 无模式:无须定义好字段类型、长度等,可以直接导入文档数据。
- 近实时存储,使每个字段都被索引且可用于搜索。
- 响应快,海量数据下能实现秒级响应速度。
- 易扩展,支持处理PB级的结构化或非结构化数据。
- 多租户,支持多个业务共用es服务,并且确保各业务间数据的隔离性。
什么是elastic stack(ELK)?
以es为核心的技术栈,包括beats、Logstash、kibana、es
什么是Lucene?
Apache的开源搜索引擎类库,提供了搜索引擎的核心API
Logstash和Beats作为底层核心引擎,共同组成了数据摄取平台,可以实现数据标准化,使数据便于后续分析使用。
什么是Logstash?
提供服务端数据处理管道,能从多个不同的数据源采集数据、转换数据,将数据发送到诸如es等“存储库”中。
Logstash过滤器(filter)能够解析各个事件,以自定义的规则识别已命名的字段,并将它们转换成通用格式。除es外,Logstash也可以将数据发送到如MySQL、Kafka、Redis等。
这都有赖于Logstash的可插拔框架。Logstash支持logstash_input_jdbc、logstash_input_kafka等200多个插件,可以将不同类型的输入数据通过输入、过滤、输出“三段论模板”灵活配置,以满足不同业务场景的需求
什么是Beats?
集合了多种单一用途的数据采集器,使数据从机器和系统向Logstash或es发送。这些数据采集器包含轻量型日志采集器Filebeat、轻量型指标采集器Metricbeat、轻量型网络数据采集器Packetbeat等。Beats所具有的可扩展的框架及丰富的预置采集器将使数据采集工作事半功倍。
什么是Kibana
使用Kibana实现es数据可视化分析。Kibana集成了丰富的可视化工具、界面交互开发工具和管理工具,辅助开发、调试和运维工作,并可以自定义各种维度的数据报表。
Kibana还是可视化的安全和监控平台,可以监控es集群的各项运维指标,让用户直观地看到集群各项指标的实时运行状态和历史变化曲线。
2. 搜索引擎
搜索引擎的目标
- 全面的信息覆盖(全面)
- 在大量数据中快速检索的速度(快速)
- 准确的返回用户想要的结果(精确)
搜索引擎的核心要求
- 识别用户真正需求,可能用户输入的不是他真想找的
- 匹配用户需求
- 找到可信数据,权威媒体大于小网站
检索质量评价指标
- 召回率:返回的结果中与搜索关键词相关的文档占所有相关文档的比例。本质是衡量检索结果的查全率,评价检索系统是否把该召回的文档都召回了
- 精确率:本次搜索结果中相关文档所占的比例,本质是衡量检索结果的查准率。当数据规模非常大时,用户更关注排在前面的结果是否相关。相较于召回率,大数据业务场景的用户更关注精准率。
召回率= N/(N+K) 精准率=N/(N+M)
2.1 倒排索引
倒排索引的概念是基于正排索引而言的。
什么是正排索引?例如给下表的id创建索引:
如果根据id查询,直接走索引,非常快。但如果基于title做模糊查询,只能是全表扫描
倒排索引
- 文档(Document):数据库的数据,例如一个网页、一个商品信息
- 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,可以分为:我、是、中国人、中国、国人这样的几个词条
创建倒排索引是对正向索引的一种特殊处理:
- 将每个文档的数据利用算法分词,得到一个个词条
- 创建表,每行数据包括词条、词条所在文档id、位置等信息
- 因为词条唯一性,可以给词条创建索引,如hash表索引
倒排索引的搜索流程如下(以搜索"华为手机"为例):
- 用户输入条件"华为手机"进行搜索。
- 对输入内容分词,得到词条:华为、手机。
- 拿着词条在倒排索引中查找,可以得到包含词条的文档id:1、2、3。
- 拿着文档id到正向索引中查找具体文档。
2.2 正排和倒排对比
- 正向索引:根据词条查询时,必须先逐条获取每个文档,判断文档中是否包含所需要的词条,是根据文档找词条的过程。
- 优点
- 可以给多个字段创建索引
- 根据索引字段搜索、排序速度非常快
- 缺点:根据非索引字段,或者索引字段中的部分词条查找时,只能扫描全表
- 优点
- 倒排索引则相反,先找到用户要搜索的词条,根据词条得到包括词条的文档的id,根据id获取文档。是根据词条找文档的过程。
- 优点:根据词条搜索,模糊搜索时速度非常快
- 缺点:
- 只能给词条创建索引,而不是字段
- 无法根据字段做排序
倒排索引主要由两部分组成:
-
单词词典:每个文档进行分词后的词项去重后组成的集合
-
倒排文件,倒排列表持久化存储的结果,通常保存在磁盘等存储设备上。倒排列表记录了词项所在文档的文档列表、单词频率等信息。
docid:文档ID,TF:词频。实际的倒排列表存储的信息更加复杂,还会包括词项在文档中出现的位置等信息,以方便实现复杂检索。
数据索引化:数据在写入搜索引擎的过程中,扫描文档,结合分词器和词典对必要的词项建立倒排索引,同时指明该词项在文章中出现的次数和位置。
全文检索的前提是待检索的数据已经索引化,当用户查询时能根据建立的倒排索引进行查找。
衡量全文检索系统的关键指标是全面、准确和快速。
全文检索的特点如下。
- 只处理文本,不处理语义。
- 结果列表有相关度排序。
- 支持高亮显示结果数据。
- 原始的文本被切分为单个单词、短语或特殊标记后进行存储。
- 给定词与它的变体(如近义词)会被折叠为一个词,如electrification和ectric、“西红柿”和“番茄”等,每组词均被视为同一个词。
3. es核心概念
一个集群可以由多个节点组成,不同的节点根据用途不同会划分成不同的角色,每个节点的数据会划分出多个索引,一个索引对应多个分片数据。
- 集群:一组es节点的集合。集群常用于处理大规模数据集,目的是实现容错和高可用。
- 节点:一个es实例。每个节点都有唯一标识的名称。节点类型如下:
- 主节点:负责集群管理和元数据维护,确保集群正常运行。
- 数据节点:负责存储、检索和处理数据,提供搜索和聚合功能。
- 协调节点:处理客户端请求,协调数据节点工作,优化分布式搜索。
- ingest节点:预处理节点,负责数据预处理,如过滤、转换等,准备好数据再将其索引到数据节点。
- 索引:用于存储和管理相关数据的逻辑容器。可以看作数据库中的一个表。es中数据以JSON格式的文档存储在索引内。索引的名称必须小写。
- 分片:假设一个索引有1TB数据。集群中有两个节点,每个节点有512GB的空间可用于存储数据。索引无法存储在任何一个节点上。分片通过将索引分成更小的部分来解决这个问题。分片将包含索引数据的一个子集,并且其本身具有完整的功能和独立性,可以将分片近似看作“独立索引”。单节点集群环境中,当索引被分片时,该索引的文档将仅存储在其中一个分片中。当处理涉及多个数据分片的查询时,es会将查询请求分发到各个相关的分片,并将结果集进行聚合。
- 副本:为了保证集群的容错性和高可用性、提高查询的吞吐率,es提供了复制数据的特性。分片可以被复制,被复制的分片称为“主分片”,复制版本称为“副本分片”或简称为“副本”,创建索引时需要指定主分片,且主分片数一经指定就不支持动态更新。副本同样需要在创建索引时指定,每个分片可以有0或多个副本,副本数支持动态更新。当某主分片所在的数据节点不可用时,会导致主分片丢失现象,若短时间内不对此采取补救措施,集群会将该分片对应的副本提升为新的主分片。es 7.X版本之后,默认主分片数为1,副本分片数为1。
- 文档:关系型数据库将数据以行或元组为单位存储在数据库表中,而es将数据以文档为单位存储在索引中。作为es的基本存储单元,文档是指存储在es索引中的JSON对象。文档中的数据由键值对构成。键是字段的名称,值是不同数据类型的字段。
- 字段:es中最小的单个数据单元,类似于关系型数据库表中的字段。不同的是,es的一个字段可以设定两种或两种以上的数据类型,通过定义multi-field来灵活地满足复杂的业务需求。
- 映射:类似于关系型数据库中的Schema,可以近似地理解为表结构
- 分词:倒排索引的本质是使用户以O(1)的时间复杂度快速召回结果数据。而分词则是构建倒排索引的重要一环。在英文文本中,空格就是切分语句或短语的“屏障”。但中文文本中则没有了这道“屏障”,于是就需要由专门的分词算法构建的分词器来实现。