🧑 博主简介:CSDN博客专家 ,历代文学网 (PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索"历代文学 ")总架构师,
15年
工作经验,精通Java编程
,高并发设计
,Springboot和微服务
,熟悉Linux
,ESXI虚拟化
以及云原生Docker和K8s
,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作 请加本人wx(注明来自csdn ):foreast_sea
【Elasticsearch】核心概念与索引设置
一、引言
在当今大数据时代,数据的存储、检索和分析变得至关重要。Elasticsearch作为一款强大的开源分布式搜索和分析引擎,正广泛应用于各个领域,如日志分析、全文搜索、商业智能等。要想充分发挥Elasticsearch的优势,深入理解其基本概念是必不可少的。
索引(Index) 、文档(Document) 、字段(Field) 以及分片等概念构成了Elasticsearch
的基础架构。索引就像是一个数据库,是存储数据的地方,但它又具有独特的分布式特性。文档则是存储在索引中的基本数据单元,类似于数据库中的一条记录。而字段是文档的组成部分,每个文档包含多个字段,用于描述不同的属性。分片则是Elasticsearch
实现分布式存储和搜索的关键,它将索引分割成多个部分,分布在不同的节点上,从而提高了系统的可扩展性和性能。
另外,索引的设置参数,如分片数量和副本数量,对索引的性能和数据存储有着深远的影响。合理设置这些参数可以优化查询速度、提高数据可用性和容错性。如果设置不当,可能会导致资源浪费、查询效率低下甚至数据丢失等问题。因此,深入分析索引设置和映射是掌握Elasticsearch
的重要环节。在接下来的文章中,我们将详细探讨这些概念及其相互关系,并深入分析索引设置对性能的影响。
二、Elasticsearch核心概念
(一)索引(Index)
- 定义
- 在Elasticsearch中,索引(Index) 是一个逻辑命名空间,用于存储具有相似特征的文档集合。可以将其类比为关系型数据库中的数据库(Database)概念。例如,如果你有一个存储用户信息的索引,所有与用户相关的文档都会存储在这个索引中。
- 索引具有自己的设置,这些设置会影响索引的行为,如分片数量、副本数量等,我们将在后面详细讨论。
- 创建索引
- 在Elasticsearch的Java API中,使用
RestHighLevelClient
来创建索引。首先需要在项目中添加Elasticsearch的Java客户端依赖。在Maven项目中,添加以下依赖:
- 在Elasticsearch的Java API中,使用
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个。最后使用RestHighLevelClient
的indices().create
方法发送创建索引的请求,并根据响应判断索引是否创建成功。
(二)文档(Document)
- 定义
- 文档(Document) 是
Elasticsearch
中的基本数据单元,它是可以被索引的信息单元。文档以JSON格式表示,包含了多个字段(Field)。例如,在一个存储商品信息的索引中,一个商品的详细信息(如名称、价格、描述等)可以组成一个文档。
- 文档(Document) 是
- 索引文档
- 继续使用上面提到的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格式的字符串表示文档内容,包含name
、price
和description
三个字段。通过source
方法将文档内容设置到请求中,最后使用RestHighLevelClient
的index
方法发送索引文档的请求,并根据响应判断文档是否索引成功。
(三)字段(Field)
- 定义
- 字段(Field) 是构成文档的基本元素,每个字段都有自己的名称和对应的值。字段的值可以是各种数据类型,如字符串、数字、日期等。例如,在前面提到的商品文档中,
name
、price
和description
就是不同的字段。
- 字段(Field) 是构成文档的基本元素,每个字段都有自己的名称和对应的值。字段的值可以是各种数据类型,如字符串、数字、日期等。例如,在前面提到的商品文档中,
- 字段数据类型
- Elasticsearch支持多种字段数据类型,常见的有:
- 字符串类型 :如
text
和keyword
。text
类型适用于全文搜索,会对文本进行分析,例如将句子拆分成单词等操作;keyword
类型则适用于精确匹配,如身份证号码、邮政编码等。 - 数字类型 :如
long
、integer
、short
、byte
、double
、float
等,用于存储不同范围的数字。 - 日期类型:用于存储日期和时间信息。
- 布尔类型 :用于存储
true
或false
值。
(四)分片(Shard)
- 定义
- 分片(Shard) 是Elasticsearch实现分布式存储和搜索的核心概念。一个索引可以被分成多个分片,每个分片实际上是一个独立的Lucene索引。分片可以分布在不同的节点(Node)上,这样可以提高数据的存储容量和搜索性能。例如,如果一个索引有大量的数据,将其分成多个分片并分布在多个节点上,可以并行处理查询请求,从而提高查询速度。
- 分片的作用
- 提高可扩展性:随着数据量的增加,可以通过增加分片的数量来扩展存储容量。
- 提高性能:多个分片可以并行处理查询请求,减少单个节点的负载,提高查询效率。
- 分布数据:将数据分布在不同的节点上,提高数据的可用性和容错性。
三、索引设置和映射
(一)索引设置
- 分片数量 (
Number of Shards
)- 分片数量在创建索引时就需要确定。例如,在前面创建索引的示例中,我们设置了
index.number_of_shards = 3
。 - 影响:
- 如果分片数量设置过少,当数据量增长时,单个分片可能会变得过大,导致查询性能下降。因为查询一个大分片需要更多的时间和资源。
- 如果分片数量设置过多,会增加管理开销,例如在进行数据重新平衡(
Rebalancing
)时,过多的分片会使这个过程更加复杂和耗时。而且每个分片都需要占用一定的系统资源,过多的分片可能会导致资源浪费。
- 分片数量在创建索引时就需要确定。例如,在前面创建索引的示例中,我们设置了
- 副本数量 (
Number of Replicas
)- 副本是分片的拷贝,用于提高数据的可用性和容错性。在创建索引时,我们设置了
index.number_of_replicas = 1
。 - 影响:
- 增加副本数量可以提高数据的可用性。当一个节点上的分片不可用时,可以从副本中获取数据,保证数据的正常查询。
- 副本也可以分担查询负载,多个副本可以同时处理查询请求,提高查询性能。但是,副本数量过多会增加存储成本,因为每个副本都需要占用额外的存储空间。
- 副本是分片的拷贝,用于提高数据的可用性和容错性。在创建索引时,我们设置了
(二)索引映射(Mapping)
- 定义
- 索引映射定义了索引中的字段类型、如何对字段进行分析等信息。它类似于关系型数据库中的表结构定义。
- 示例
- 以下是一个简单的索引映射的JSON示例:
json
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"price": {
"type": "double"
},
"description": {
"type": "text"
}
}
}
}
- 在这个示例中,定义了
name
、price
和description
三个字段的类型,name
和description
为text
类型,price
为double
类型。
四、结论
Elasticsearch的核心概念,如索引、文档、字段和分片等,以及索引设置和映射,是构建高效、可靠的搜索和分析应用的基础。深入理解这些概念及其相互关系,合理设置索引参数,能够充分发挥Elasticsearch的强大功能,满足不同场景下的数据存储、检索和分析需求。
五、参考资料文献
- Elasticsearch官方文档
- 《Elasticsearch实战》书籍
- Elasticsearch GitHub仓库