全文检索
想要学习Elasticsearch首先要理解什么是全文检索
相关概念
数据的分类
数据可以分为结构化数据和非结构化数据
结构化数据
- 具有固定格式或有限长度的数据,如数据库
非结构化数据
- 无固定格式或不定长度的数据,如办公文档,文章内容
对非结构化数据进行搜索的两种方式
想要查找一个非结构化数据的内容,如含有某个句子的文章,一般有两种方式
顺序扫描法
- 即按顺序对所有文档进行从头到尾的扫描查找
反向索引法
- 提前将文档内容的关键字建成索引,然后根据索引进行查找文档
什么是全文检索?
对非结构化数据通过反向索引法进行搜索的过程叫做全文检索
全文检索的应用场景
- 搜索引擎
- 站内搜索
- 系统文件搜索
- 日志分析
全文检索相关技术
- Lucene
- 早期,使用复杂,需要编写大量 Java 代码
- Solr
- Apache Lucene 项目的开源企业级搜索引擎,使用简单,提供 RESTful API
- Elasticsearch
- 基于 Lucene 开发,使用简单,提供 RESTful API
Solr 和 Elasticsearch 对比
- 单纯对已有数据进行搜索时Solr更快
- 实时建立索引时,Solr会产生IO阻塞,影响搜索效率,Elasticsearch不会
- 随着数据量的增加Solr效率会下降,Elasticsearch无明显变换
全文检索的基本流程
- 存储
- 原始文档
- 使用分词组件将文档文词(分词,去除标点符号,去除停用词)
- 使用语言处理组件进行处理(大写转小写,复数变单数,过去时、将来时变现在时)
- 创建索引词典
- 将索引和文档入库(索引存入索引域,文档存入文档域)
- 索引和文档建立关联
- 搜索
- 搜索内容
- 将内容进行分词和处理
- 匹配索引单词
- 返回符合索引对应的文档
Elasticsearch
Elasticsearch 是什么
- Elasticsearch 是一个开源的,基于Lucene的全文搜索引擎
- 发布于2010年,使用Java编写,隐藏了Lucene的复杂性,提供一套简单的RESTful API
- 适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据
- Elasticsearch 不仅仅是 Lucene,并且也不仅仅是一个全文搜索引擎,能力包括:
- 一个分布式的实时文档存储,每个字段可以被索引与搜索
- 一个分布式实时分析搜索引擎
- 能胜任上百个服务节点的扩展,并支持PB级别的数据
Elastic Stack 介绍
Elastic Stack 是适用于数据采集、充实、存储、分析和可视化的一组开源工具。 包括搜索和分析引擎Elasticsearch、数据搜集和日志解析引擎LogStash 以及分析和可视化平台Kibana。 这三个产品被设计成一个集成解决方案,称为 Elastic Stack (ELK Stack)。
LogStash 是什么
- Logstash 是一个开源的服务器端数据处理管道
- 可用来对数据进行聚合和处理,并将数据发送到 Elasticsearch
- 由于日志文件来源多(如:系统日志、服务器 日志等),且内容杂乱,不便于人类进行观察。因此,我们可以使用 Logstash 对日志文件进行收集和统一过滤,变成可读性高的内容,方便开发者或运维人员观察,从而有效的分析系统/项目运行的性能,做好监控和预警的准备工作等。
Kibana 是什么
- Kibana 是一个开源的分析和可视化平台,旨在与 Elasticsearch 合作。
- 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。
- 开发者或运维人员可以轻松地执行高级数据分析,并在各种图表、表格和地图中可视化数据。
Elasticsearch 的用途
- 数据搜索
- 日志处理和分析
- 基础设施指标和容器检测
- 地理空间数据分析和可视化
- 业务分析
相关概念
Node 节点
- 一个Elasticsearch实例即一个节点
Cluster 集群
- 一个或多个拥有相同cluster.name的Elasticsearch实例组成一个集群
Index 索引
- 一个索引类似于传统关系型数据库中的一个数据库,是一个存储关系型文档的地方
- 索引名必须小写,不能以下划线开头,不能包含逗号
Type 类型
- 类似数据库中的表
Document 文档
- 即数据,JSON格式。
- 命名可以是大写或者小写,但是不能以下划线或者句号开头,不应该包含逗号, 并且长度限制为256个字符
Field 字段
- 文档中的属性,字段,数据库表中的列
- 字段的名字可以是任何合法的字符串,但 不可以 包含英文句号
索引、类型、文档和属性关系
- 一个 Elasticsearch 集群可以包含多个索引,相应的每个索引可以包含多个类型
- 这些不同的类型存储着多个文档,每个文档又有多个属性
Mappings 映像
- 数据的约束
倒排索引
- 关系型数据库通过增加一个索引,比如一个 B树(B-tree)索引到指定的列上,以便提升数据检索速度
- Elasticsearch 和 Lucene 使用了一个叫做倒排索引的结构来达到相同的目的
- 一个没有倒排索引的属性是不能被搜索到的