数据库

一幅图,搞定 Elasticsearch 核心基础原理!

转载:一幅动图,搞定 Elasticsearch 核心基础原理!

在大数据时代,实时高效地处理信息成为了企业和开发者的必需。而在众多工具中,Elasticsearch 无疑占据了核心地位。它不仅以实时数据处理能力被高度重视,还因其在搜索与分析方面的强大功能而备受推崇。

今天,我们通过一幅清晰的图,一起深入探讨 Elasticsearch 的工作原理。

 

Elasticsearch简介


Elasticsearch是一个开源的搜索引擎,也是ELK(现称为Elastic Stack)的重要组成部分。它可以与数据可视化工具 Kibana 和日志处理器 Logstash 无缝集成,从而大大增强了其实用性。

Elasticsearch通过一种被称为“倒排索引”的技术,实现快速的全文搜索功能,这与我们翻阅书籍索引找到内容的方式颇为相似。

 

梳理工作流程


数据的导入和解析

在Elasticsearch中,首先需要导入数据。这个过程通常涉及将数据格式化为 JSON 格式,因为 Elasticsearch 使用 JSON 作为数据交换格式。

在这张图中,你可以看到一个示例数据“The cat in the tree”,这段文本被转换成 JSON 格式并准备导入到 Elasticsearch 中。

  

数据的分析和索引

导入Elasticsearch后,数据会被分析和索引。

这一步骤是通过Elasticsearch 的分词器完成的,它将文本拆分成更易于搜索的单词或短语,即“tokens”。

这些tokens随后被用来创建一个倒排索引,这是一种特殊的数据结构,用于快速全文搜索。

倒排索引将每个唯一的单词映射到包含该单词的所有文档,这在图中通过连接线和节点表示。

   

分布式架构

Elasticsearch是一个分布式搜索引擎,这意味着数据可以跨多个服务器(称为节点)存储和检索。

这种架构提高了系统的扩展性和容错能力。在图中,你可以看到数据被存储在不同的服务器上,这有助于分散负载和提高查询效率。

 

查询解析和执行

当用户通过一个搜索界面(如图中的笔记本电脑)输入查询时,Elasticsearch会解析这个查询请求。

解析过程包括理解查询中的关键词以及可能的查询意图,然后使用这些信息来检索倒排索引。

 

得分和排序

一旦Elasticsearch找到了所有相关的文档,它将基于相关性给这些文档打分。

打分机制通常依赖于因素如关键词的出现频率、文档中的位置等。

这些分数用于对结果进行排序,以确保最相关的结果排在最前面。

  

返回结果

最后,搜索结果会被返回给用户,通常也是以JSON格式。用户可以看到最相关的文档排在最前面,这使得用户能够快速有效地找到他们需要的信息。

这整个过程不仅高效而且具有很高的可扩展性,使Elasticsearch成为处理大规模数据集的理想选择。

通过这种方式,Elasticsearch支持复杂的全文搜索功能,广泛应用于各种场景中,如日志分析、实时数据监控和复杂搜索需求。

  

Elasticsearch 优势与应用

Elasticsearch 的几大优势包括出色的可伸缩性、实时搜索能力以及直观的 RESTful API,使得它能够有效地进行大规模数据分析。通过对日志和事件数据的广泛分析,Elasticsearch加强了监控和诊断能力,有助于提升应用安全性和性能。

Elasticsearch的应用场景多种多样,从电商平台上的即时产品搜索到金融系统上的实时交易分析,再到监控和日志系统中,它聚合并分析日志,提供系统健康状况和潜在安全威胁的详细视图。

超越搜索功能,Elasticsearch 支持实时数据索引和通过聚合特性进行基本分析,使其成为大数据分析工具集的一部分。

动画示意为我们揭示了 Elasticsearch 如何在信息时代扮演着不可或缺的角色,无论是在快速搜索、数据分析,还是系统监控方面,Elasticsearch都展现出其不可替代的价值。

通过这幅图,我们可以说真正地把 Elasticsearch 的工作原理讲透了。

 

Elasticsearch倒排索引详解


倒排索引简介

倒排索引是全文搜索引擎的核心数据结构,其主要作用是从文档中提取关键词,并建立关键词到文档的映射关系。这种结构与传统的正排索引(即文档到关键词的映射)相反,因此称为倒排索引。 在倒排索引中,每个关键词都关联着包含该关键词的文档列表,这使得搜索操作能够迅速定位包含特定关键词的文档,从而大幅提高查询效率。

 

倒排索引的基本结构


倒排索引的基本结构包括以下几个部分:

  1. 词典(Dictionary):包含所有在文档集中出现的关键词。
  2. 倒排列表(Inverted List):对于每个关键词,记录包含该关键词的文档ID列表及其在文档中的位置信息。

举一个简单的例子:
假设我们有以下三个文档:

  • 文档1:"Elasticsearch is a powerful search engine"
  • 文档2:"Elasticsearch uses inverted index"
  • 文档3:"Search engines use indexes"

构建倒排索引的步骤如下:

  1. 词条化(Tokenization):将文档拆分为单词,并进行规范化处理(如转小写、去除停用词等)。
  2. 建立词典:提取所有文档中的唯一单词。
  3. 创建倒排列表:记录每个单词在各个文档中的出现位置。

结果如下:

  • elasticsearch -> {1, 2}  出现在文档1和文档2
  • is -> {1}   出现在文档1
  • a -> {1}   出现在文档1
  • powerful -> {1}   出现在文档1
  • search -> {1, 3}   出现在文档1和文档3
  • engine -> {1}   出现在文档1
  • uses -> {2}   出现在文档2
  • inverted -> {2}   出现在文档2
  • index -> {2}   出现在文档2
  • engines -> {3}   出现在文档3
  • use -> {3}   出现在文档3
  • indexes -> {3}   出现在文档3

 

Elasticsearch中的倒排索引


索引和文档

在Elasticsearch中,数据以索引(Index)的形式存储,每个索引包含多个文档(Document)。每个文档是一个JSON对象,包含多个字段(Field),每个字段都有相应的值。

 

创建倒排索引

当一个文档被索引时,Elasticsearch会对文档进行分析(Analyze),将其分解为多个词条(Term)。分析过程包括分词(Tokenization)、词干提取(Stemming)和去除停用词(Stop Word Removal)等步骤。处理后的词条将被添加到倒排索引中。

 

倒排索引的存储结构

Elasticsearch基于Apache Lucene构建,Lucene使用了一种高效的倒排索引存储结构。每个索引由多个分片(Shard)组成,每个分片是一个Lucene索引。在每个Lucene索引中,倒排索引以段(Segment)形式存储。段是不可变的文件集合,当有新的文档添加时,Lucene会创建新的段,并定期进行段合并(Segment Merging)以减少文件数量和提高查询性能。

 

词典和倒排列表的优化

为了提高查询效率,Lucene对词典和倒排列表进行了多种优化:

  1. 跳表(Skip List):在倒排列表中引入跳表结构,允许快速跳转到指定位置,加速查询速度。
  2. 前缀压缩(Prefix Compression):对词典中的相邻词条进行前缀压缩,减少存储空间。
  3. 块索引(Block Indexing):将倒排列表分成固定大小的块,每个块包含多个文档ID。查询时,可以快速定位到包含目标文档ID的块,从而减少遍历的时间。

 

倒排索引的查询过程

当用户发起搜索请求时,Elasticsearch会根据查询条件在倒排索引中查找匹配的文档。以关键词查询为例,查询过程如下:

  1. 解析查询:将用户输入的查询字符串解析为关键词列表。
  2. 查找词典:在倒排索引的词典中查找每个关键词,获取对应的倒排列表。
  3. 合并结果:根据倒排列表合并结果,生成匹配文档的列表。
  4. 计算评分:对匹配的文档进行相关性评分,排序后返回给用户。

 

示例

假设我们要搜索关键词"Elasticsearch search engine",查询过程如下:

  1. 解析查询:["elasticsearch", "search", "engine"]
  2. 查找词典:
    • elasticsearch -> {1, 2}
    • search -> {1, 3}
    • engine -> {1}
  3. 合并结果:文档1包含所有关键词,文档2和文档3分别包含部分关键词。
  4. 计算评分:根据文档与查询的匹配度进行评分,假设文档1得分最高,则返回文档1。

 

倒排索引的优缺点


优点

  1. 高效的关键词搜索:倒排索引允许快速查找包含特定关键词的文档,极大提高了查询效率。
  2. 可扩展性:通过分片和副本机制,Elasticsearch能够处理大规模数据,并保证高可用性。
  3. 灵活的查询能力:支持多种查询类型,如布尔查询、范围查询、模糊查询等,满足不同应用需求。

 

缺点

  1. 存储空间占用较大:倒排索引需要存储词典和倒排列表,可能占用较多存储空间,尤其是处理大规模文本数据时。
  2. 实时性较弱:由于倒排索引的构建和更新需要一定时间,可能无法满足高实时性要求的应用场景。

 

倒排索引在实际应用中的优化


分析器配置

Elasticsearch提供多种内置分析器,如标准分析器(Standard Analyzer)、简洁分析器(Simple Analyzer)等。用户可以根据实际需求选择合适的分析器,并进行定制化配置,如添加同义词过滤器(Synonym Filter)等。

 

分片和副本

通过合理配置分片(Shard)和副本(Replica)数量,可以提高Elasticsearch集群的查询性能和容错能力。分片允许将数据分布到多个节点上,副本提供数据冗余以应对节点故障。

 

缓存机制

Elasticsearch支持多种缓存机制,如查询缓存(Query Cache)、过滤器缓存(Filter Cache)等。合理利用缓存可以减少磁盘I/O,提高查询性能。

 

数据分层存储

对于大规模数据,可以采用冷热分离存储策略,将近期活跃数据存储高性能存储介质上,将历史数据存储在低成本存储介质上,降低存储成本的同时保证查询性能。

 

ELK


  • ElasticSearch:索引、搜索和统计。
  • logstash:主要是搜集,解析和转换日志,把各种格式转换成固定格式,方便es等软件去分析。
  • Kibana:主要用于展示,提供了图标、表格、地图等组件

从用途上来划分,从下至上可以分为采集层、服务层、展示层: