【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. 定义
  2. 在Elasticsearch中,索引(Index) 是一个逻辑命名空间,用于存储具有相似特征的文档集合。可以将其类比为关系型数据库中的数据库(Database)概念。例如,如果你有一个存储用户信息的索引,所有与用户相关的文档都会存储在这个索引中。
  3. 索引具有自己的设置,这些设置会影响索引的行为,如分片数量、副本数量等,我们将在后面详细讨论。
  4. 创建索引
  5. 在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. 定义
    2. 文档(Document)Elasticsearch中的基本数据单元,它是可以被索引的信息单元。文档以JSON格式表示,包含了多个字段(Field)。例如,在一个存储商品信息的索引中,一个商品的详细信息(如名称、价格、描述等)可以组成一个文档。
    3. 索引文档
    4. 继续使用上面提到的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. 定义
    2. 字段(Field) 是构成文档的基本元素,每个字段都有自己的名称和对应的值。字段的值可以是各种数据类型,如字符串、数字、日期等。例如,在前面提到的商品文档中,namepricedescription就是不同的字段。
    3. 字段数据类型
    4. Elasticsearch支持多种字段数据类型,常见的有:
    5. 字符串类型:如textkeywordtext类型适用于全文搜索,会对文本进行分析,例如将句子拆分成单词等操作;keyword类型则适用于精确匹配,如身份证号码、邮政编码等。
    6. 数字类型:如longintegershortbytedoublefloat等,用于存储不同范围的数字。
    7. 日期类型:用于存储日期和时间信息。
    8. 布尔类型:用于存储truefalse值。

    (四)分片(Shard)

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

    三、索引设置和映射

    (一)索引设置

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

    (二)索引映射(Mapping)

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

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

    五、参考资料文献

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

    作者:程风破~

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Elasticsearch】核心概念与索引设置

    发表回复