ELK 技术栈(Elasticsearch+Logstash+Kibana)
核心组件:
Elasticsearch:分布式搜索和分析引擎,负责日志存储和检索,基于 Lucene 实现倒排索引。
Logstash:数据收集管道,负责日志的收集、过滤和格式化,包含 input、filter、output 三个处理阶段。
Kibana:可视化界面,将 Elasticsearch 数据通过图表展示,提供实时分析功能。
工作原理:
日志从各服务器收集后,经 Logstash 处理格式化。
存储到 Elasticsearch 进行索引和检索。
通过 Kibana 仪表盘进行可视化展示和分析。
应用场景:
日志分析处理、应用监控、安全分析、业务数据可视化。
适合需要集中化管理分散日志的场景,可将数小时排查工作缩短到几分钟。
超大规模日志的收集、存储、搜索/分析都是一个现实面临的问题,也是一个需要迫切解决的问题。延伸推广,网络爬虫爬到的信息,需要存储和检索,与日志问题类似,也需要一个收集、存储、搜索/分析过程。这类应用涉及海量数据以及全文搜索与分析。
这就是搜索引擎\索引所涉及的技术。
一个搜索引擎/程序:数据结构+算法
关系型数据库系统,就是由关系型数据存储模型和SQL算法组成。
全文搜索也需要两个层次,数据要保存下来,需要一定的数据结构;一定的搜索算法,用户查询接口。
搜索组件+索引链
搜索组件就是算法,索引链就是数据结构。
一个完整的全文搜索引擎,其架构大体如下:
一个完整的搜索引擎系统,用户需要一个接口与其交互,即UI,用户在UI中输入查询的内容,获得查询的结果;用户输入的查询内容,需要经过构建查询的组件,形成一个合规的查询,然后由执行查询组件,运行这个查询;执行查询的组件需要借助索引,从索引中查找具体的内容,将找到的内容反馈给读取结果组件,这个组件负责获取内容输出前的整理,然后按照一定格式,通过UI接口反馈给用户。查询的内容是从索引中获取的,索引的建立,要从获取原始内容开始,通过一定的方式,将原始数据,如各服务器上的日志信息,网络爬虫获取的网页信息等,汇集后,由获取内容组件进行分析整理,然后通过构建文档组件,创建文档,通过分析文档组件,对文档进行分析,主要是将文本分割成一系列语汇单元,还可能进行一些其他操作,如语法修正、是否插入同义词、单词合并等,最后由创建索引组件根据分析文档的结果,创建索引。
这个过程可以类比关系型数据库的过程,索引组件完成的功能,相当于数据的收集,通过事务操作,通过外部数据导入等方式,在数据库中建立表,并插入数据;然后用户可以通过SQL交互工具,从数据库中查找需要的结果,就类似搜索组件完成的功能。
全文搜索引擎是应对大数据时代信息检索需求的产物,大数据时代的特征,用4个V概括:
Volume:数据量大,数据规模从 TB 级跃升至 PB、EB 甚至 ZB 级;
Variety:类型繁多,涵盖结构化、半结构化和非结构化数据(文本、图像、音视频、日志等);
Velocity:处理速度快,数据流速快,对数据处理的实时性要求高;
Value:价值密度低,海量数据蕴含的巨大价值,需算法挖掘提炼才能释放高整体价值。
ElasticSearch
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它是一个完整的搜索引擎,实现了上图中的搜索组件和索引组件功能,并能够实现对索引的分布式存储和处理,扩展性好,高可靠性。不过,Elasticsearch的搜索和索引核心功能是借助于Lucene实现的,是对Lucene的二次包装,并提供更抽象的功能调用,即Elasticsearch使Lucene更加易于使用。
上图中的紫色部分就是Lucene实现的功能,也就是搜索引擎核心的索引和搜索功能,都是Lucene实现的。Elasticsearch在Lucene的基础上,提供了分布式存储和处理,实现高可用性,提供了RESTful API,扩展了多语言客户端驱动支持等。
Lucene
Lucene是一款高性能、可扩展的信息检索(IR)工具库。IR —— Information Retrieval ;(retrieve:侧重从存储中“取回、调出”数据或信息,常用于计算机、数据库语境),可见这里的检索是要求数据提前准备好了的。
信息检索库与Web搜索引擎是不同的两个概念。
Lucene是一种搜索工具,只是一个Java类库,提供了一套简单而强大的核心API,使用它们时不必深入理解全文索引和搜索机制。其本质是一个软件类库,或者说是一个工具箱,一个开源的全文搜索引擎工具包,而并不是一个完整的搜索程序,人们通常将Lucene误解为一个完整的搜索程序,而实际上它只是搜索程序的核心索引和搜索模块而已。lucene专注于文本索引和搜索功能。
Lucene主要实现的是全文检索,是具有完整的查询引擎和索引引擎的全文检索库。Lucene能够把从文本中解析出来的数据进行索引和搜索,其不关心数据来源、格式、语种,只要能把它转换为文本格式即可,可以索引和搜索存储在文件中的如下数据:远程Web服务器上的网页、本地文件系统中的文档、简单的文本文件、Word文档、XML文档、HTML文档或PDF文档,或其他能够从中提取文本信息的数据格式。
信息检索(IR)常用的术语:
用户需求(User Need,简称UN):用户需要获得的信息,有时也称为主题(Topic);
查询(Query):UN提交给IR系统时称为查询;
文档(Document):是信息检索的对象,可以是文本、图像、音视频等;
文档集(Crops):若干文档构成的集合,文档集有时也称语料库,文件系统中的文本文件、海量互联网网页、大量日志文件等都是文档集;
文档编号(Document ID):给文档集中的每个文档赋予的唯一标识符,通过文档ID来区分不同的文档,缩写为docID;
词条化(tokenization):将给定的字符序列拆分成一系列子序列的过程,拆分的每个子序列称为一个词条;
词项(Term):是经过语言学预处理之后归一化的词条,词项是索引的最小单位;
词项-文档关联矩阵(Incidence matrix):是表示词项和文档之间所具有的一种包含关系的概念模型。如
从纵向即文档维度看,每列代表一个文档包含的词项信息,从横向即词项维度看,每行代表该词项在文档中的分部信息。这个是一个很重要的术语,实际上,以纵向做索引,即对文档做索引,由文档找到词项,就是正派索引,以横向做索引,即以词项做索引,由词项找到所在文档,就是倒排索引。
词项频率(Term frequency):同一个词项在某个文档中出现的频率;
文档频率(Document frequency):出现某词项的文档的数目;
倒排记录表(Posting lists):用于记录出现过某个词项的所有文档的文档列表以及词项在该文档中出现的位置信息,每条记录称为一个倒排项;
倒排文件(Inverted file):倒排记录表在磁盘中的物理存储文件;
分词算法:就是词条化的算法,将短语或句子切分的算法,中文分词主要有3中方法:
词典匹配分词法、语义理解分词法、词频统计分词法
倒排索引(Inverted index):索引是构成搜索引擎的核心技术之一,倒排索引也被称为反向索引,是一种索引的方法,被用来存储在全文搜索下某个词项在一个文档或一组文档中的存储位置的映射。
假设两个文档doc1和doc2,doc1包含3个关键词:苹果、香蕉、桃子,doc2包含4个关键词:苹果、香蕉、橘子、西瓜,则文档和词语的包含关系,即正排索引,如下:
词语所属文档的关系,就是倒排索引:
检索模型:是判断文档内容与用户查询相关性的核心技术,主要有以下几种
布尔检索模型:利用布尔运算符连接各个检索词进行逻辑运算,找出所需信息的一种检索方法,数学基础是集合论,每篇文档被看成一系列词的集合;
tf-idf权重计算模型:tf-idf称为词频-逆文档频率,用以计算词项对于一个文档集或一个语料库中的一份文件的重要程度。词项的重要性随着它在文档中出现的次数成正比增加,但同时会随着它在文档集中出现的频率成反比例下降。
向量空间模型(Vector Space Model,VSM):把对文本内容的处理简化为向量空间中的向量计算,以空间上的相似度表达语义的相似度,其数学理论基础是余弦相似性理论:
向量A=(x1,x2,...,xn),向量B=(y1,y2,...,yn)
Sim(A,B)=cosθ ;
夹角余弦值cosθ 是与向量的长度无关的,仅仅与向量的指向方向相关。
概率检索模型:从概率排序原理推导而来,基本思想是,给定一个查询,返回的文档能够按照查询和用户需求的相关性得分高低来排序,目前最成功的概率检索模型是BM25(Best Match 25)模型,改进的是Okapi BM25模型。其数学基础是贝叶斯决策理论,其在机器学习、自然语言处理等领域被广泛应用,核心思想是选择高概率对应的类别。二值独立模型(Binary Independence Model,BIM)也是一种概率检索模型。
Lucene深入了解
Lucene实现了索引和搜索两种组件,即一个完整的搜索引擎框架。
上面的搜索引擎框架图的下半部分,展现了所有搜索引擎的首要部分,叫做索引操作,负责将原始数据引入可被高效查找的对照表中,以便能进行快速搜索。
索引组件:
如需要搜索大量文件,找出其中包含某词语的文件,初级方法是顺序扫描每个文件,看其是否包含这个词语,此方法存在的问题是不能对太大或太多的文件进行处理。于是就需要引入索引:建立针对文本的索引,将文本内容转换为能够进行快速搜索的格式,消除慢速顺序扫描处理带来的影响,这个过程就叫做索引操作(indexing),它的输出就叫做索引(index)。搜索引擎使用的是倒排索引。
索引的建立步骤:
获取内容 ==> 建立文档 ==> 文档分析 ==> 文档索引
建立文档:是在获取原始内容后,需要对内容进行索引,则首先必须将这些内容转换成部件(通常称为文档)。
文档:Document
是包含了一个或多个域的容器;
field:value ,field叫做域,类似关系型数据库中的字段,是键值对,只是这里的键叫做域; 真正搜索时,搜索的是value的内容。并且文档中的域,不像关系型数据库,关系型数据库是有固定的Schema的,字段是固定的,而文档的域是不固定的。
在这里文档这个词是一个很容易让人迷惑的术语,没有接触搜索引擎前,认为文档就是一个个文件,文件系统中的一个个文件,但在搜索引擎语境里,文档更像是关系型数据库中表的一条记录,文件系统中的一个文档,在搜索引擎的建立文档过程中,可能会生成多个文档,即类似关系型数据库中插入多条记录。
域(field):有很多选项
索引选项、存储选项、域向量使用选项
索引选项用于通过倒排索引来控制文本是否可被搜索:
Index:ANYLYZED #分析(切词)并单独作为索引项;
Index.Not_ANYLYZED:不分析(不切词),把整个内容当一个索引项;
Index.ANYLYZED_NO_NORMS:类似ANALYZED,但不存储token的Norms(加权基准)信息;
Index.Not_ANYLYZED_NO_NORMS:类似于Not_ANALYZED,但不存储值的Norms(加权基准)信息;
Index.NO: 不对此域的值进行索引;因此不能被搜索;
存储选项:是否需要存储域的真实值
store.YES:存储真实值
store.NO:不存储真实值
域向量选项:用于在搜索期间该文档所有的唯一项都能完全从文档中检索时使用;
文档和域的加权操作: 加权计算标准;
文档分析:搜索引擎不能直接对文本进行索引,必须将文本分割成一系列词汇单元的独立原子元素,这就是文档分析。分析(Analysis),在Lucene中指将域(Field)文本转换为最基本的索引表示单元——项(Term)的过程。将文本转换为语汇单元,操作可能包括提取单词、去除标点符号、将字母转为小写(也称规范化)、去除常用词、将单词还原为词干形式等,这个处理过程称为语汇单元化过程(tokenization),而从文本流中提取的文本块称为语汇单元(token)。语汇单元与它的域名结合后,就形成了项/词项(Term)。
使用Lucene时,合适的分析器是非常关键的。
文档索引:在索引步骤中,文档将被加入到索引列表。
搜索:
查询Lucene索引时,它返回的是一个有序的scoreDoc对象;查询时,Lucene会为每个文档计算出其score;
Lucene是一个软件包,或者叫类库,提供的是一系列完成相关功能的接口,即API,搜索功能的API有如下几种:
IndexSearcher:搜索索引入口;
Query及其子类:
QueryParser:
TopDocs:
ScoreDoc:
Lucene的多样化查询: IndexSearcher中的search方法
TermQuery:对索引中的特定项进行搜索;Term是索引中的最小索引片段,每个Term包含了一个域名和一个文本值;如:new Term(“title”,“中国”)。
TermRangeQuery:在索引中的多个特定项中进行搜索,能搜索指定的多个域;
NumericRangeQuery:做数值范围搜索;
PrefixQuery:用于搜索以指定字符串开头的项;
BooleanQuery:用于实现组合查询;组合逻辑有: AND, OR, NOT;
PhraseQuery:多关键字搜索;
WildcardQuery:通配符搜索;
FuzzyQuery:模糊查询;Levenshtein
Elasticsearch深入理解:从Lucene到Elasticsearch
Elasticsearch是一个基于Lucene实现的开源、分布式、Restful的全文本搜索引擎,是一个搜索服务器,使用Lucene构建索引、提供搜过功能、开放源码的企业级搜索引擎。Lucene只是一个Java语言编写的库,Elasticsearch在Lucene基础上做了改进,提供了多种语言接口,专注于企业应用。此外,它还是一个分布式实时文档存储,其中每个文档的每个field均是被索引的数据,且可被搜索;也是一个带实时分析功能的分布式搜索引擎,能够扩展至数以百计的节点实时处理PB级的数据。
Elasticsearch的目标是让全文搜索变得简单,通过简单的RESTFul API轻松实现搜索功能。
基于Elasticsearch衍生出来的一系列开源软件,统称为Elastic Stack,主要包括分布式搜索引擎Elasticsearch、日志采集与分析工具Logstash、可视化分析平台Kibana、数据采集工具Beats家族等。没有引入Beats前,Elasticsearch、Logstash、Kibana三者简称ELK stack。
还有一个Tika,是一个具有内置解析器用于处理各种文档类型的程序框架,用于实现从各种文档中提取文本信息,如从word、excel、PDF、RTF、TAR、ZIP等类型中提取文本信息。
Elasticsearch,简称为ES,其是一个集群结构(也可以单节点运行)
核心概念:
集群(cluster):一个或多个安装Elasticsearch的服务器节点组织在一起就是集群,它们共同持有整个数据,并提供索引和搜索功能。一个集群由一个唯一的名字标识,称为cluster name,集群名称非常重要,具有相同集群名称的节点才会组成一个集群。可在配置文件中指定
节点(node):一个节点就是集群中的一台服务器,存储数据,参与集群的索引和搜索功能。一个节点通过配置集群名称的方式加入一个指定的集群。运行了单个ES实例的主机。节点的标识靠节点名。
索引(index):一个索引就是一个拥有几个相似特征的文档的集合,文档容器,换句话说,索引是具有类似属性的文档的集合。类似于表。索引名必须使用小写字母;
类型(type):在一个索引中,可以定义一种或多种类型,一个类型是索引的一个逻辑上的分类或分区。
文档(Document):一个文档是一个可被索引的基础信息单元。它包含了一个或多个域,是域的容器;基于JSON格式表示。每个域的组成部分:一个名字,一个或多个值;拥有多个值的域,通常称为多值域;
分片(shard):一个索引可以存储超出单个节点硬件限制的大量数据。这时就可以将索引划分成多份,即分片。每个分片本身也是一个功能完善且独立的子索引,这个子索引可被放置到集群中的任何节点上。分片很重要,因为允许水平分割/扩展内容容量,允许在分片上进行分布式的、并行的操作,可以说分片是Elasticsearch集群的基础。
副本:集群环境中,某个节点/分片可能会突然崩溃,这时一个故障转移机制非常重要,Elasticsearch允许创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或副本。副本的作用,一是在分片/节点失败情况下,保证高可用(因此副本不能与主分片在同一节点上),二是扩展搜索量/吞吐量,因为搜索可在副本上并行运行。
映射(mapping):原始内容存储为文档之前需要事先进行分析,例如切词、过滤掉某些词等;映射用于定义此分析机制该如何实现;除此之外,ES还为映射提供了诸如将域中的内容排序等功能。
每个索引可被分成多个分片,一个索引可以有一份或多份副本,一旦有了副本,每个索引就有了主分片和副本分片之分。
相关概念与关系型数据库的对比:Elasticsearch可以看成一个数据库。
| RDMS | Elasticsearch |
| 数据库(Database) | 索引(index) |
| 表(table) | 类型(type) |
| 行(row) | 文档(document) |
| 列(column) | 域(field) |
| 表结构(Schema) | 映射(Mapping) |
| 索引 | 全文索引 |
| SQL | 查询DSL |
SELECT * from tablename | GET http://...... |
| UPDATE table SET | PUT http://...... |
| DELETE | DELETE http://...... |
ES Cluster工作过程:
启动时,通过多播(默认)或单播方式在9300/tcp查找同一集群中的其它节点,并与之建立通信。
集群中的所有节点会选举出一个主节点负责管理整个集群状态,以及在集群范围内决定各shards的分布方式。站在用户角度而言,每个均可接收并响应用户的各类请求。
集群有状态:green, red, yellow
文档结构:
Elasticsearch中的文档是用JSON来表示的,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。JSON对象在花括号中书写,对象包含多个名称/值对。