> 技术文档 > 【Elasticsearch】核心概念与索引设置_elasticsearch索引设计

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


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

在这里插入图片描述


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

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

一、引言

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

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

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

二、Elasticsearch核心概念

(一)索引(Index)

  1. 定义
    • 在Elasticsearch中,索引(Index) 是一个逻辑命名空间,用于存储具有相似特征的文档集合。可以将其类比为关系型数据库中的数据库(Database)概念。例如,如果你有一个存储用户信息的索引,所有与用户相关的文档都会存储在这个索引中。
    • 索引具有自己的设置,这些设置会影响索引的行为,如分片数量、副本数量等,我们将在后面详细讨论。
  2. 创建索引
    • 在Elasticsearch的Java API中,使用RestHighLevelClient来创建索引。首先需要在项目中添加Elasticsearch的Java客户端依赖。在Maven项目中,添加以下依赖:
<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代码示例:
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,以下是向索引中添加文档的示例代码:
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)

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

  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示例:
{ \"mappings\": { \"properties\": { \"name\": { \"type\": \"text\" }, \"price\": { \"type\": \"double\" }, \"description\": { \"type\": \"text\" } } }}
  • 在这个示例中,定义了namepricedescription三个字段的类型,namedescriptiontext类型,pricedouble类型。

四、结论

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

五、参考资料文献

  1. Elasticsearch官方文档
  2. 《Elasticsearch实战》书籍
  3. Elasticsearch GitHub仓库