【Elasticsearch】核心概念与索引设置

🧑 博主简介:CSDN博客专家历代文学网 (PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索"历代文学 ")总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作 请加本人wx(注明来自csdn ):foreast_sea


【Elasticsearch】核心概念与索引设置

一、引言

在当今大数据时代,数据的存储、检索和分析变得至关重要。Elasticsearch作为一款强大的开源分布式搜索和分析引擎,正广泛应用于各个领域,如日志分析、全文搜索、商业智能等。要想充分发挥Elasticsearch的优势,深入理解其基本概念是必不可少的。

索引(Index)文档(Document)字段(Field) 以及分片等概念构成了Elasticsearch的基础架构。索引就像是一个数据库,是存储数据的地方,但它又具有独特的分布式特性。文档则是存储在索引中的基本数据单元,类似于数据库中的一条记录。而字段是文档的组成部分,每个文档包含多个字段,用于描述不同的属性。分片则是Elasticsearch实现分布式存储和搜索的关键,它将索引分割成多个部分,分布在不同的节点上,从而提高了系统的可扩展性和性能。

另外,索引的设置参数,如分片数量和副本数量,对索引的性能和数据存储有着深远的影响。合理设置这些参数可以优化查询速度、提高数据可用性和容错性。如果设置不当,可能会导致资源浪费、查询效率低下甚至数据丢失等问题。因此,深入分析索引设置和映射是掌握Elasticsearch的重要环节。在接下来的文章中,我们将详细探讨这些概念及其相互关系,并深入分析索引设置对性能的影响。

二、Elasticsearch核心概念

(一)索引(Index)

  1. 定义
    • 在Elasticsearch中,索引(Index) 是一个逻辑命名空间,用于存储具有相似特征的文档集合。可以将其类比为关系型数据库中的数据库(Database)概念。例如,如果你有一个存储用户信息的索引,所有与用户相关的文档都会存储在这个索引中。
    • 索引具有自己的设置,这些设置会影响索引的行为,如分片数量、副本数量等,我们将在后面详细讨论。
  2. 创建索引
    • 在Elasticsearch的Java API中,使用RestHighLevelClient来创建索引。首先需要在项目中添加Elasticsearch的Java客户端依赖。在Maven项目中,添加以下依赖:
xml 复制代码
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch - rest - high - level - client</artifactId>
    <version>7.17.9</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.17.9</version>
</dependency>
  • 这里添加了elasticsearch - rest - high - level - client依赖,它是Elasticsearch的高级REST客户端,用于方便地与Elasticsearch集群进行交互。同时添加了elasticsearch核心库依赖。
  • 以下是创建索引的Java代码示例:
java 复制代码
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentType;

import java.io.IOException;

public class IndexCreation {
    public static void main(String[] args) {
        // 假设已经创建好RestHighLevelClient实例,名为client
        RestHighLevelClient client = null;
        try {
            CreateIndexRequest request = new CreateIndexRequest("my_index");
            request.settings(Settings.builder()
                   .put("index.number_of_shards", 3)
                   .put("index.number_of_replicas", 1));
            CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
            boolean acknowledged = response.isAcknowledged();
            if (acknowledged) {
                System.out.println("索引创建成功");
            } else {
                System.out.println("索引创建失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (client!= null) {
                    client.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 在上述代码中,首先创建了一个CreateIndexRequest对象,指定要创建的索引名称为my_index。然后通过settings方法设置索引的分片数量为3个,副本数量为1个。最后使用RestHighLevelClientindices().create方法发送创建索引的请求,并根据响应判断索引是否创建成功。

(二)文档(Document)

  1. 定义
    • 文档(Document)Elasticsearch中的基本数据单元,它是可以被索引的信息单元。文档以JSON格式表示,包含了多个字段(Field)。例如,在一个存储商品信息的索引中,一个商品的详细信息(如名称、价格、描述等)可以组成一个文档。
  2. 索引文档
    • 继续使用上面提到的Java API,以下是向索引中添加文档的示例代码:
java 复制代码
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;

import java.io.IOException;

public class DocumentIndexing {
    public static void main(String[] args) {
        // 假设已经创建好RestHighLevelClient实例,名为client
        RestHighLevelClient client = null;
        try {
            IndexRequest request = new IndexRequest("my_index");
            String jsonString = "{" +
                    "\"name\": \"iPhone 14\"," +
                    "\"price\": 7999," +
                    "\"description\": \"A new smartphone\"" +
                    "}";
            request.source(jsonString, XContentType.JSON);
            IndexResponse response = client.index(request, RequestOptions.DEFAULT);
            String index = response.getIndex();
            String id = response.getId();
            if (response.getResult().name().equals("CREATED")) {
                System.out.println("文档成功索引到索引 " + index + " 中,文档ID为 " + id);
            } else {
                System.out.println("文档索引失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (client!= null) {
                    client.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 在上述代码中,创建了一个IndexRequest对象,指定要将文档索引到my_index索引中。然后构建了一个JSON格式的字符串表示文档内容,包含namepricedescription三个字段。通过source方法将文档内容设置到请求中,最后使用RestHighLevelClientindex方法发送索引文档的请求,并根据响应判断文档是否索引成功。

(三)字段(Field)

  1. 定义
    • 字段(Field) 是构成文档的基本元素,每个字段都有自己的名称和对应的值。字段的值可以是各种数据类型,如字符串、数字、日期等。例如,在前面提到的商品文档中,namepricedescription就是不同的字段。
  2. 字段数据类型
    • Elasticsearch支持多种字段数据类型,常见的有:
    • 字符串类型 :如textkeywordtext类型适用于全文搜索,会对文本进行分析,例如将句子拆分成单词等操作;keyword类型则适用于精确匹配,如身份证号码、邮政编码等。
    • 数字类型 :如longintegershortbytedoublefloat等,用于存储不同范围的数字。
    • 日期类型:用于存储日期和时间信息。
    • 布尔类型 :用于存储truefalse值。

(四)分片(Shard)

  1. 定义
    • 分片(Shard) 是Elasticsearch实现分布式存储和搜索的核心概念。一个索引可以被分成多个分片,每个分片实际上是一个独立的Lucene索引。分片可以分布在不同的节点(Node)上,这样可以提高数据的存储容量和搜索性能。例如,如果一个索引有大量的数据,将其分成多个分片并分布在多个节点上,可以并行处理查询请求,从而提高查询速度。
  2. 分片的作用
    • 提高可扩展性:随着数据量的增加,可以通过增加分片的数量来扩展存储容量。
    • 提高性能:多个分片可以并行处理查询请求,减少单个节点的负载,提高查询效率。
    • 分布数据:将数据分布在不同的节点上,提高数据的可用性和容错性。

三、索引设置和映射

(一)索引设置

  1. 分片数量Number of Shards
    • 分片数量在创建索引时就需要确定。例如,在前面创建索引的示例中,我们设置了index.number_of_shards = 3
    • 影响:
    • 如果分片数量设置过少,当数据量增长时,单个分片可能会变得过大,导致查询性能下降。因为查询一个大分片需要更多的时间和资源。
    • 如果分片数量设置过多,会增加管理开销,例如在进行数据重新平衡(Rebalancing)时,过多的分片会使这个过程更加复杂和耗时。而且每个分片都需要占用一定的系统资源,过多的分片可能会导致资源浪费。
  2. 副本数量Number of Replicas
    • 副本是分片的拷贝,用于提高数据的可用性和容错性。在创建索引时,我们设置了index.number_of_replicas = 1
    • 影响:
    • 增加副本数量可以提高数据的可用性。当一个节点上的分片不可用时,可以从副本中获取数据,保证数据的正常查询。
    • 副本也可以分担查询负载,多个副本可以同时处理查询请求,提高查询性能。但是,副本数量过多会增加存储成本,因为每个副本都需要占用额外的存储空间。

(二)索引映射(Mapping)

  1. 定义
    • 索引映射定义了索引中的字段类型、如何对字段进行分析等信息。它类似于关系型数据库中的表结构定义。
  2. 示例
    • 以下是一个简单的索引映射的JSON示例:
json 复制代码
{
    "mappings": {
        "properties": {
            "name": {
                "type": "text"
            },
            "price": {
                "type": "double"
            },
            "description": {
                "type": "text"
            }
        }
    }
}
  • 在这个示例中,定义了namepricedescription三个字段的类型,namedescriptiontext类型,pricedouble类型。

四、结论

Elasticsearch的核心概念,如索引、文档、字段和分片等,以及索引设置和映射,是构建高效、可靠的搜索和分析应用的基础。深入理解这些概念及其相互关系,合理设置索引参数,能够充分发挥Elasticsearch的强大功能,满足不同场景下的数据存储、检索和分析需求。

五、参考资料文献

  1. Elasticsearch官方文档
  2. 《Elasticsearch实战》书籍
  3. Elasticsearch GitHub仓库
相关推荐
airuike12327 分钟前
以微见著,精准护航:MEMS IMU助力高铁轨道智能检测
大数据·人工智能·科技
青稞社区.1 小时前
Claude Code 源码深度解析:运行机制与 Memory 模块详解
大数据·人工智能·elasticsearch·搜索引擎·agi
T06205142 小时前
【面板数据】地级市及区县人口空心化数据(2000-2024年)
大数据
Aktx20FNz3 小时前
iFlow CLI 完整工作流指南
大数据·elasticsearch·搜索引擎
LaughingZhu3 小时前
Anthropic 收购 Oven 后,Claude Code 用运行时写了一篇护城河文章
大数据·人工智能·经验分享·搜索引擎·语音识别
学习3人组3 小时前
TortoiseGit冲突解决实战上机练习
大数据·elasticsearch·搜索引擎
Ln5x9qZC24 小时前
Flink SQL 元数据持久化实战
大数据·sql·flink
OYpBNTQXi4 小时前
Flink Agents 源码解读 --- (6) --- ActionTask
大数据·flink
A__tao4 小时前
Elasticsearch Mapping 一键生成 Go Struct,支持嵌套解析
elasticsearch·es
中金快讯5 小时前
济民健康医疗服务占比提升至46%!业务结构调整初见成效
大数据·人工智能