首页 > 其他分享 >Elasticsearch

Elasticsearch

时间:2024-06-20 18:59:01浏览次数:19  
标签:分片 索引 文档 org import Elasticsearch

Elasticsearch(ES),这是一个开源的搜索和分析引擎,广泛用于各种应用中以实现全文搜索、结构化搜索、分析和复杂的数据查询。下面我将详细介绍Elasticsearch的基本概念、架构和工作原理。

Elasticsearch的基本概念

节点(Node)

Elasticsearch运行的单个实例称为节点。每个节点都存储数据,并参与集群的索引和搜索功能。

集群(Cluster)

集群是由一个或多个节点组成的集合,协同工作以存储数据并提供索引和搜索能力。每个集群都有一个唯一的名字。

索引(Index)

索引是具有相似特征的一组文档的集合。在关系型数据库中,相当于数据库。

文档(Document)

文档是可以被索引的基本单元,是JSON格式的。它类似于关系型数据库中的行。

类型(Type)(在Elasticsearch 6.x及以后版本中已经弃用)

类型是文档的一个逻辑分类。在一个索引中,可以有多个类型,每个类型有自己的字段。

分片(Shard)

索引可以被分为多个分片。每个分片都是一个独立的Lucene索引,可以存储在集群中的任何节点上。分片可以是主分片或副本分片。

Elasticsearch的架构

分布式

Elasticsearch是分布式的,意味着它能够处理大规模的数据存储和搜索请求。数据可以分布在多个节点上。

高可用性

通过副本分片机制,Elasticsearch保证了数据的冗余和高可用性。如果一个节点失效,数据可以从其他节点上的副本分片中恢复。

近实时

Elasticsearch提供近实时的搜索能力。索引的数据几乎可以立即被搜索到。
Elasticsearch的工作原理

索引(Indexing)

当一个文档被索引时,Elasticsearch会将其放入一个主分片,并根据配置将其复制到相应的副本分片。索引操作包括解析文档、创建倒排索引和存储数据。

搜索(Searching)

当接收到一个搜索请求时,Elasticsearch会将请求发送到所有相关的分片。每个分片独立执行搜索,然后将结果合并返回给用户。

分片管理

Elasticsearch通过集群管理机制来自动处理分片的分配、重新平衡和副本管理。

使用Elasticsearch的Java代码示例

下面是一个简单的Java代码示例,展示了如何使用Elasticsearch客户端来索引和搜索文档:

import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.common.xcontent.XContentType;
import java.io.IOException;

public class ElasticsearchExample {
    public static void main(String[] args) {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new RestClientBuilder.HttpHosts(
                        new HttpHost("localhost", 9200, "http"))));

        // 索引一个文档
        IndexRequest indexRequest = new IndexRequest("myindex")
                .id("1")
                .source("{\"field1\":\"value1\"}", XContentType.JSON);
        try {
            IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
            System.out.println("Index response: " + indexResponse.getResult().toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 搜索文档
        SearchRequest searchRequest = new SearchRequest("myindex");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchQuery("field1", "value1"));
        searchRequest.source(searchSourceBuilder);

        try {
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println("Search response: " + searchResponse.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Elasticsearch 写入数据的工作原理

接收请求

客户端发送一个写入请求(如索引文档)到Elasticsearch集群的某个节点。

路由到主分片

Elasticsearch根据文档ID计算目标主分片的位置,默认情况下使用哈希算法进行计算。然后请求被路由到包含该主分片的节点。

写入主分片

主分片节点接收到写入请求后,将文档写入到本地的Lucene索引中。Lucene将文档分解成倒排索引并存储。

复制到副本分片

主分片节点将写操作传递给所有副本分片。副本分片节点接收到请求后,也会将文档写入本地的Lucene索引中。

确认写入完成

当所有副本分片都成功写入后,主分片节点返回确认消息给客户端,表示写入操作完成。

Elasticsearch 查询数据的工作原理

接收请求

客户端发送一个查询请求到Elasticsearch集群的某个节点。

分发到所有分片

请求节点将查询请求分发到相关索引的所有主分片和副本分片。

执行查询

每个分片独立执行查询。Lucene使用倒排索引快速查找与查询匹配的文档ID。

聚合结果

每个分片将其查询结果返回给请求节点。请求节点将所有分片的结果合并、排序、去重等处理。

返回结果

最终结果集返回给客户端。

底层的Lucene

Apache Lucene是一个高性能、全功能的搜索库。Elasticsearch使用Lucene作为其底层引擎,负责索引和搜索功能。

索引

Lucene将文档拆分为字段,然后将字段内容拆分为词条(terms)。
词条被存储在倒排索引中,其中每个词条记录了包含该词条的文档ID列表。

搜索

Lucene使用倒排索引来快速查找包含特定词条的文档。
Lucene还提供了多种查询类型(如布尔查询、短语查询、范围查询等)来满足不同的搜索需求。

倒排索引

倒排索引是一种数据结构,主要用于全文检索系统中。它从文档内容中提取出所有的词条,并建立词条到文档的映射关系。

构建过程

每个文档被解析成独立的词条。
词条作为索引项,记录下其所在的文档ID和词频等信息。

查询过程

查询时,根据查询词条在倒排索引中查找,获取包含该词条的文档ID列表。
然后根据文档ID列表进行进一步的处理,如计算相关性、排序等。

倒排索引的示例

假设我们有三个文档:

Doc1: "I love programming"
Doc2: "Programming is fun"
Doc3: "I love fun"
构建的倒排索引如下:

Term         Document IDs
-------------------------
I            [Doc1, Doc3]
love         [Doc1, Doc3]
programming  [Doc1, Doc2]
is           [Doc2]
fun          [Doc2, Doc3]

查询"love"时,返回[Doc1, Doc3]。

综合示例

为了更好地理解,我们结合上述概念用代码来演示Elasticsearch的写入和查询过程。假设我们使用Java客户端。

import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.common.xcontent.XContentType;
import java.io.IOException;

public class ElasticsearchExample {
    public static void main(String[] args) {
        // 创建客户端
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new RestClientBuilder.HttpHosts(
                        new HttpHost("localhost", 9200, "http"))));

        // 索引一个文档
        IndexRequest indexRequest = new IndexRequest("myindex")
                .id("1")
                .source("{\"field1\":\"I love programming\"}", XContentType.JSON);
        try {
            IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
            System.out.println("Index response: " + indexResponse.getResult().toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 搜索文档
        SearchRequest searchRequest = new SearchRequest("myindex");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchQuery("field1", "love"));
        searchRequest.source(searchSourceBuilder);

        try {
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println("Search response: " + searchResponse.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Elasticsearch写数据的底层原理

这个过程涉及多个组件和步骤,从接收到写请求到最终将数据持久化到磁盘。

1. 写入内存 Buffer 和 Translog

接收写请求
当一个写请求(如索引一个文档)到达Elasticsearch集群时,它会被路由到包含目标主分片的节点。这个分片位置是通过文档ID哈希计算得到的。

写入 Buffer
文档被写入到内存中的 buffer。这个 buffer 是暂存数据的地方。

写入 Translog
同时,写操作被记录到事务日志(translog)中。Translog 用于数据恢复,确保数据在系统崩溃时不会丢失。

内存 Buffer <--- 文档
     |
     v
Translog <--- 写操作日志

2. 刷新(Refresh)操作

触发刷新
默认情况下,每秒钟会触发一次刷新操作。刷新操作将 buffer 中的数据写入一个新的 segment file。

写入 OS Cache
数据不会立即写入磁盘,而是先写入操作系统缓存(OS Cache)。这个缓存是操作系统级别的内存缓存。

清空 Buffer
一旦数据进入 OS Cache,就可以被搜索到,因此 buffer 可以被清空。

Buffer --> 刷新操作 --> OS Cache --> Segment File

3. Segment File

  • Segment File 生成
    每次刷新操作都会生成一个新的 segment file,这些文件存储在磁盘上但首先进入 OS Cache。

  • 合并 Segment
    随着时间的推移,Elasticsearch会自动执行段合并操作,将多个小的 segment file 合并成一个大的 segment file。这有助于提高搜索性能并减少文件数量。

4. Flush 操作

  • 触发条件
    Flush 操作通常在以下情况下触发:
  1. 每隔 30 分钟。
  2. 当 translog 达到一定大小。
  • 过程
  1. 刷新 Buffer:确保 buffer 中的数据被刷新到 OS Cache 中。
  2. 写入 Commit Point:记录当前所有 segment file 的标识。
  3. 强制写入磁盘:将 OS Cache 中的数据强制写入磁盘(fsync)。
  4. 清空 Translog:清空现有的 translog,并开始一个新的 translog。
Buffer --> 刷新 --> OS Cache --> Segment File --> Flush --> Disk
Translog (FSYNC)

5. Translog

  • Translog 的作用
    Translog 用于保证数据的持久性,即使系统崩溃。每次写操作都会被记录到 translog 中。默认情况下,translog 每 5 秒 fsync 到磁盘。

  • 恢复数据
    在系统重启时,Elasticsearch 会读取 translog 并恢复未持久化的数据到 buffer 和 OS Cache 中。

配置参数

  • index.translog.sync_interval:

控制 translog 多久 fsync 到磁盘,默认是 5 秒钟,最小为 100ms。

  • index.translog.durability:

    • 设置 translog 是每 5 秒钟刷新一次还是每次请求都 fsync。这个参数有两个取值:
      • request:每次请求都执行 fsync,确保每次写操作都被持久化。
      • async:默认值,translog 每隔 5 秒钟 fsync 一次。

数据写入流程总结

  1. 接收写请求:
    请求被路由到包含目标主分片的节点。
  2. 写入 Buffer 和 Translog:
    文档写入内存 buffer,同时记录到 translog。
  3. 刷新操作:
    每秒钟刷新 buffer,将数据写入 OS Cache 中的 segment file,并清空 buffer。
  4. Flush 操作:
    每 30 分钟或 translog 达到一定大小时,触发 flush 操作,确保所有数据都持久化到磁盘。
  5. Translog 恢复:
    在系统重启时,通过 translog 恢复未持久化的数据,确保数据完整性。

标签:分片,索引,文档,org,import,Elasticsearch
From: https://www.cnblogs.com/eiffelzero/p/18259325

相关文章

  • ElasticSearch入门(实战)
    环境准备:VMwaredocker   创建一个linux虚拟机,使用dockerpullelasticsearch 部署单体服务: dockerpullelasticsearch:6.8.13#elasticsearch十分占用内存,用这种方式启动会导致Linux卡机dockerrun-d--nameelasticsearch-p9200:9200-p9300:9300-e"discover......
  • 【2024最新精简版】ElasticSearch面试篇
    文章目录你们项目中主要使用ElasticSearch干什么什么是正向索引?什么是倒排索引?......
  • Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的
    目录Elasticsearch聚合查询说明空值率查询DSLElasticsearch聚合基础知识扩展Elasticsearch聚合概念Script用法Elasticsearch聚合查询语法指标聚合(MetricAggregations)桶聚合(BucketAggregations)矩阵聚合(MatrixAggregations)组合聚合(PipelineAggregations)Elasticsearch聚合查询......
  • Elasticsearch 的事务日志
    translog是Elasticsearch保证数据可靠性和灾难恢复的重要组件,每个索引分片配备一个translog,对索引数据的增加、更新操作都会记录在translog中。translog本质上是一个可滚动的日志文件,相比于lucene的写入,日志文件的写入是一个相对轻量的操作,translog会定期地sync到磁......
  • Elasticsearch 近实时搜索的底层原理
    我们都知道Elasticsearch的搜索是近实时的,数据写入后,立即搜索(不通过id)文档是搜不到的。这一切的原因要归于lucene所提供的API,因为lucene的API就是非实时的,Elasticsearch在lucene之上盖房子,通过一些增强,实现了查询的近实时和id查询的实时性。本文就来看看这个近实时......
  • 5、docker-部署ES(elasticsearch)+kibana
    #es暴露的端口多#es十分消耗内存#es的数据一般需要放置到安全目录、挂载=========================================安装es=========================1、下载启动es(建议启动前把其它容器停止,不然会很卡)·dockerrun-d--nameelasticsearch-p9200:9200-p9300:9300......
  • 微服务开发与实战Day09 - Elasticsearch
    一、DSL查询Elasticsearch提供了DSL(DomainSpecificLanguage)查询,就是以JSON格式来定义查询条件。类似这样:DSL查询可以分为两大类:叶子查询(Leafqueryclauses):一般是在特定的字段里查询特定值,属于简单查询,很少单独使用。复合查询(Compoundqueryclauses):以逻辑方式组合多个叶......
  • 利用Elasticsearch提升Java应用的搜索能力
    引言:在数据驱动的时代,能够快速地处理和分析大量数据变得至关重要。Elasticsearch不仅提供全文搜索功能,还支持复杂的数据分析,是现代应用中不可或缺的工具之一。什么是Elasticsearch?Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎。它允许你以近实时的方式存储、搜索......
  • Elasticsearch:简化数据流的数据生命周期管理
    作者:来自Elastic AndreiDan今天,我们将探索Elasticsearch针对数据流的新数据管理系统:数据流生命周期,从版本8.14开始提供。凭借其简单而强大的执行模型,数据流生命周期可让n你专注于数据生命周期的业务相关方面,例如降采样和保留。在后台,它会自动确保存储数据的Elastics......
  • elasticsearch的入门与实践
    Elasticsearch是一个基于Lucene构建的开源搜索引擎。它提供了一个分布式、多租户能力的全文搜索引擎,具有HTTPweb接口和无模式的JSON文档。以下是Elasticsearch的入门与实践的基本步骤:入门安装Elasticsearch:从Elasticsearch官网下载对应版本的Elasticsearch。根据操作系......