【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仓库
相关推荐
cuijiecheng201818 分钟前
音视频入门基础:MPEG2-TS专题(20)——ES流简介
大数据·elasticsearch·音视频
菠萝炒饭pineapple-boss21 分钟前
全局JDK环境和ES自带的JDK混用导致的ES集群创建失败
开发语言·elasticsearch
ala咪22 分钟前
git配置以及替换gerrit默认commit-msg hook~转
大数据·elasticsearch·搜索引擎
菠萝炒饭pineapple-boss26 分钟前
部署单机版本的elasticsearch服务
大数据·elasticsearch·搜索引擎
科技资讯快报31 分钟前
诸葛智能CTO文革:放大数据价值,释放金融营销原动力
大数据·人工智能
科技资讯快报36 分钟前
容联云孔淼:金融数智化深水区,从数字化工具到业务变革提效
大数据
拓端研究室1 小时前
【专题】2024抖音电商母婴行业分析报告汇总PDF洞察(附原数据表)
大数据
JasonHome1 小时前
ElasticSearch 数据同步
elasticsearch
Elastic 中国社区官方博客1 小时前
带有 Elasticsearch 和 Langchain 的 Agentic RAG
大数据·人工智能·elasticsearch·搜索引擎·ai·langchain