小工具知识网

当前位置: 首页 > 行业知识 > ElasticSearch 学习、实践笔记

行业知识

ElasticSearch 学习、实践笔记

2026-11-05 01:47:26 来源:互联网转载

一、基础概念

1. ���引(Index):索引是 Elasticsearch 中最基本的数据存储单位,类似于关系型数据库中的数据库。一个索引可以包含多个文档,每个文档都有一个唯一的 ID,用于标识该文档。索引可以被分为多个分片,每个分片可以存储一部分文档数据。

()

 2. 文档(Document):文档是 Elasticsearch 中的基本数据单元,类似于关系型数据库中的行。每个文档都有一个唯一的 ID,用于标识该文档。文档可以包含多个字段,每个字段都有一个数据类型,例如字符串、数字、日期等。

3. 分片(Shard):分片是 Elasticsearch 中的数据分布方式,用于将索引分成多个部分,每个部分可以存储一部分文档数据。分片可以被分配到不同的节点上,以实现数据的分布式存储和查询。

()

4. 节点(Node):节点是 Elasticsearch 中的一个实例,它可以存储一部分数据和处理查询请求。一个节点可以属于一个或多个集群,每个集群可以包含多个节点。节点之间可以通过网络通信来协调数据的存储和查询。

架构是分布式的,它将数据分成多个分片存储在不同的节点上,通过网络通信来协调数据的存储和查询。这种架构可以实现高可用性、高性能和可扩展性。

二、创建索引

1.在客户端调用API创建索引(.NET CORE[c#])

/// /// 如果索引不存在就创建/// /// /// public async Task CreateIndexIfNotExist(string index)where ESEntity: ESBase,new (){    if (index.IsNullOrEmpty())    {        return;    }    //指定分片数量    IIndexState indexState = new IndexState    {        Settings = new IndexSettings        {            NumberOfReplicas = 0,              NumberOfShards = 5         }     };    //自动映射 + 指定属性映射    //https://blog.csdn.net/WuLex/article/details/71375032    Func func =         x => x.InitializeUsing(indexState)            .Map(                m => m.AutoMap()                    .Properties(ps => ps                      .Nested(n => n                        .Name(c => c.Contents)                        .AutoMap()                            .Properties(ps => ps                                .Nested(n => n                                    .Name(c => c.FileContents)                                    .AutoMap()                        )))));    var response = await Client.Indices.CreateAsync(index, func);    if (response != null && response.ApiCall != null && response.ApiCall.DebugInformation.IsNotNullOrEmpty())    {        if (!response.ApiCall.Success)        {            Logger.LogInformation($"创建索引:{response.DebugInformation}");         }    }}

2.直接执行 json脚本创建

PUT /my_index{  "settings": {    "number_of_shards": 1,    "number_of_replicas": 1  },  "mappings": {    "properties": {      "title": {        "type": "text"      },      "description": {        "type": "text"      },      "price": {        "type": "float"      },      "date": {        "type": "date"      },      "tags": {        "type": "keyword"      }    }  }}

二、查询

Elasticsearch 支持多种查询类型,包括全文搜索查询、精确匹配查询、范围查询、布尔查询、聚合查询等;以下是使用 Elasticsearch 进行全文搜索查询、精确匹配查询、范围查询、布尔查询和聚合查询的示例:

1.全文搜索查询

GET /my_index/_search{  "query": {    "match": {      "description": "search term"    }  }}

2.精确匹配查询

GET /my_index/_search{  "query": {    "term": {      "status": "active"    }  }}

3.范围查询

GET /my_index/_search{  "query": {    "range": {      "price": {        "gte": 10,        "lte": 100      }    }  }}

4.布尔查询

GET /my_index/_search{  "query": {    "bool": {      "must": [        { "match": { "description": "search term" } },        { "term": { "status": "active" } }      ],      "must_not": [        { "term": { "category": "books" } }      ],      "should": [        { "term": { "brand": "Apple" } },        { "term": { "brand": "Samsung" } }      ]    }  }}

5.聚合查询(统计总和、平均值、最大值和最小值...)

GET /index_topic/_search{  "query": {    "bool": {      "must": [        {          "term": {            "Deleted":  0          }        },        {          "term": {            "CountryId":  "CN"          }        }      ]    }  },   "size": 0,  "aggs": {    "total_count": {      "sum": {        "field": "TopicId"      }    },    "max_topic_id": {      "max": {        "field": "TopicId"      }    },    "min_topic_id": {      "min": {        "field": "TopicId"      }    }  }} 

6.通配符和正则表达式进行模糊匹配(会让性能下降,慎用,特别是左模糊开启的时候)

-- 右模糊匹配GET /my_index/_search{  "query": {    "wildcard": {      "description": "elasticsearch*"    }  }}-- 正则GET /my_index/_search{  "query": {    "regexp": {      "description": ".*elasticsearch.*"    }  }}

7. 分页查询

{  "query": {    "match": {      "description": "Elasticsearch tutorial"    }  },  "from": 0,  "size": 10}

8. 条件删除数据

POST /index_topic/_delete_by_query{  "query": {    "match": {      "TopicId": "1739499560356679680"    }  }}

三、设计索引时应该怎么考虑索引的分片和副本数、字段的类型和属性等因素

  1. 索引的分片和副本数:分片和副本数是 Elasticsearch 中非常重要的概念,它们可以影响索引的性能、可用性和容错能力。一般来说,分片数应该根据数据量和查询负载来确定,副本数应该根据可用性和容错能力来确定。如果数据量较大或查询负载较高,可以增加分片数来提高查询性能;如果需要提高可用性和容错能力,可以增加副本数来实现数据冗余和负载均衡。

  2. 字段的类型和属性:在定义索引中的字段时,需要考虑字段的类型和属性,以便更好地满足业务需求。例如,如果需要进行全文搜索,可以将文本类型字段设置为全文搜索类型,并指定相应的分析器;如果需要进行聚合查询,可以将数值类型字段设置为聚合类型,并指定相应的聚合方式。此外,还可以设置字段的索引选项、存储选项、忽略字段等属性,以便更好地控制字段的行为和性能。

  3. 索引的更新和删除策略:在设计索引时,需要考虑索引的更新和删除策略,以便更好地控制索引的性能和存储空间。例如,如果需要频繁更新或删除文档,可以将索引设置为支持快速更新和删除的类型,并使用合适的缓存策略来提高性能;如果需要保留历史数据或备份数据,可以将索引设置为支持冷热分离的类型,并使用合适的存储策略来降低存储成本。

  4. 索引的查询负载和性能需求:在设计索引时,需要考虑索引的查询负载和性能需求,以便更好地优化查询性能和响应时间。例如,如果查询负载较高或查询响应时间较长,可以使用缓存策略、查询优化器、索引分析器等技术来提高查询性能;如果需要支持实时查询或高并发查询,可以使用分布式查询、负载均衡、索引优化等技术来提高查询性能和可用性。

四、 ES 数据的冷热分离

设计 Elasticsearch 数据的冷热分离需要考虑以下几个方面:

  1. 数据的访问频率:将访问频率较高的数据放在热节点上,访问频率较低的数据放在冷节点上。

  2. 数据的存储周期:将存储周期较短的数据放在热节点上,存储周期较长的数据放在冷节点上。

  3. 数据的大小:将数据较小的放在热节点上,数据较大的放在冷节点上。

  4. 数据的重要性:将重要性较高的数据放在热节点上,重要性较低的数据放在冷节点上。

在实际应用中,可以通过以下几种方式来实现数据的冷热分离:

  1. 使用 Elasticsearch 的索引别名功能,将热数据和冷数据分别放在不同的索引中,并使用别名来统一访问。

  2. 使用 Elasticsearch 的节点标签功能,将热节点和冷节点分别打上不同的标签,并使用标签来控制数据的路由。

  3. 使用 Elasticsearch 的分片路由功能,将热数据和冷数据分别路由到不同的分片中,并使用分片路由来控制数据的访问。

  4. 使用 Elasticsearch 的索引生命周期管理功能,根据数据的存储周期来自动将数据从热节点转移到冷节点。

上一篇:GDPay下载指南,一键获取,轻松掌握使用教程

下一篇:系统服务器软件怎么维护?