创建索引时,ES,分片和副本定义原则
在 Elasticsearch (ES) 中创建索引时,number_of_shards
和 number_of_replicas
是非常关键的设置项,它们决定了索引的分布和冗余策略。下面是这些设置的详细定义和原则:
1. number_of_shards
(分片数)
-
作用:决定了索引的分片数量。每个分片是一个独立的 Lucene 索引,它包含数据的一部分,并且可以独立地进行查询和存储。
-
默认值 :
5
。 -
原则:
- 数据规模:较大的数据量可以增加分片数,以便分散存储和提高查询效率。例如,数据量达到 TB 级别时,可以考虑更多的分片。
- 硬件资源:分片数过多会消耗更多的资源(内存和 CPU)。需要根据集群的硬件配置来合理设置。
- 性能优化:如果分片数量过多,可能会导致 Elasticsearch 负载过高,因为每个分片都会占用一定的资源。理想情况下,分片数应该与数据量和集群节点的数量成比例。
-
建议:
- 在创建索引时,可以根据集群的规模和数据量来合理决定分片数。例如,小规模集群可能使用
3
或5
个分片,而大规模集群可能会增加到10
或更多。 - 需要注意的是,
number_of_shards
一旦设置并创建索引后不能更改。
- 在创建索引时,可以根据集群的规模和数据量来合理决定分片数。例如,小规模集群可能使用
2. number_of_replicas
(副本数)
-
作用:决定每个分片的副本数量。副本是原始分片的备份,通常用于增加数据的可用性和容错能力。
-
默认值 :
1
(即每个分片有一个副本)。 -
原则:
- 容错性:副本是为了数据冗余和提高查询性能。如果一个主分片失效,副本可以作为备用,确保数据的可用性和可靠性。
- 查询性能:副本不仅提供容错功能,还能提高查询性能,因为副本分片和主分片一样可以处理查询请求。
- 硬件资源:每增加一个副本,集群的存储需求就会增加。需要根据集群的硬件容量合理设置副本数。
-
建议:
- 对于生产环境,通常建议设置至少
1
个副本,以保证高可用性。 - 如果查询请求较高,并且需要负载均衡,则可以考虑增加副本数,例如设置
2
或更多副本,但这也意味着需要更多的存储和计算资源。
- 对于生产环境,通常建议设置至少
3. 示例配置:
json
{ "settings": { "index": { "number_of_shards": 5, // 分片数设置为5 "number_of_replicas": 1 // 副本数设置为1 } } }
4. 选择分片和副本数量时的注意事项:
-
分片的数量与集群节点数量:通常推荐分片数不应过多,以避免每个节点负担过重。理想的情况是分片的数量应该大致匹配集群中节点的数量。比如,如果有 5 个节点,且总共有 10 个分片,建议每个节点分担 2 个分片。
-
副本的数量与数据安全性:副本数决定了数据的冗余程度。在高可用环境中,副本数设置为 1 至少可以保证在一个节点宕机时数据不会丢失。根据实际需求可以增加副本数来增强数据安全性,但这会带来更多的存储和计算负担。
-
动态调整 :虽然
number_of_shards
一旦设置无法更改,但副本数是可以在运行时调整的。例如,你可以随时增加或减少副本数,来适应集群负载和容错需求。
5. 总结:
number_of_shards
影响数据分布,合理配置可以帮助提高数据分布效率和查询性能。number_of_replicas
影响数据的冗余性、容错性和查询性能。合理配置副本数可以提升数据的可靠性,但需要更多存储资源。
在实际使用时,应根据数据量、查询需求、硬件资源以及容错要求来调整分片数和副本数,做到平衡性能和资源消耗。
es分词器
Elasticsearch(ES)中的分词器是用于将文本数据分割成更小的单位(如词条、标记或词汇单元),并用于索引和搜索。在 Elasticsearch 中,分词器有多个种类,根据不同的需求,分词器能够影响索引和查询的效果。下面是一些常见的分词器类型和相关概念:
1. 分词器的工作原理
分词器通常由两个部分组成:
- Tokenizer(分词器):将输入的文本切分成词项。
- Token Filters(词项过滤器):对分词结果进行进一步的处理,例如删除停用词、转换大小写等。
2. 常见的分词器类型
1. Standard Analyzer(标准分析器)
- 功能 :这是 Elasticsearch 默认的分析器。它首先会使用
standard tokenizer
将文本切分成词项,然后应用一组常见的token filters
,如小写化、去除停用词等。 - 适用场景:适用于大多数英文文本的分词。
json
"settings": { "analysis": { "tokenizer": { "standard": { "type": "standard" } } } }
2. Whitespace Analyzer(空格分析器)
- 功能:这个分析器基于空格将文本切分成词项,没有任何更复杂的操作,所有字符之间有空格的部分会被认为是一个词项。
- 适用场景:适合处理没有标点符号、且词项由空格分开的情况。
json
"settings": { "analysis": { "tokenizer": { "whitespace": { "type": "whitespace" } } } }
3. Keyword Analyzer(关键词分析器)
- 功能:此分析器将整个输入文本作为一个词项,不进行任何切分操作。也就是说,输入的文本将被视为一个完整的关键字。
- 适用场景:适用于不需要分词的字段(如 ID、邮箱等)。
json
"settings": { "analysis": { "tokenizer": { "keyword": { "type": "keyword" } } } }
4. IK Analyzer(IK 分词器)
- 功能:IK 是一个开源的中文分词器,支持精确模式和智能模式。精确模式将文本分割为精确的词项,智能模式则会尽量将文本分割为语义相关的部分。
- 适用场景:适合中文文本分析。Elasticsearch 默认不包含 IK 分词器,需要额外安装插件。
json
"settings": { "analysis": { "tokenizer": { "ik_max_word": { "type": "ik_max_word" } } } }
5. Pinyin Analyzer(拼音分析器)
- 功能:这是一个用于中文拼音搜索的分析器。它会将中文字符转换成拼音,并进行分词。
- 适用场景:适用于中文拼音检索。
json
"settings": { "analysis": { "tokenizer": { "pinyin": { "type": "pinyin" } } } }
6. Edge NGram Analyzer(前缀分词器)
- 功能:将文本切分为以不同长度的前缀为基础的词项。适用于实现自动补全(Autocomplete)功能。
- 适用场景:适用于需要实现前缀匹配的查询,例如自动补全搜索框。
json
"settings": { "analysis": { "tokenizer": { "edge_ngram": { "type": "edge_ngram", "min_gram": 1, "max_gram": 25, "token_chars": ["letter", "digit"] } } } }
3. 分词器和分析器的配置
在 Elasticsearch 中,可以通过自定义分析器来组合分词器和词项过滤器。以下是一个自定义分析器的示例:
json
{ "settings": { "analysis": { "tokenizer": { "my_custom_tokenizer": { "type": "edge_ngram", "min_gram": 2, "max_gram": 5, "token_chars": ["letter", "digit"] } }, "filter": { "lowercase": { "type": "lowercase" } }, "analyzer": { "custom_analyzer": { "type": "custom", "tokenizer": "my_custom_tokenizer", "filter": ["lowercase"] } } } } }
4. 分词器的选择和优化
- 选择分词器时需要考虑以下因素 :
- 文本语言:中文、英文、阿拉伯文等语言的分词规则不同,需要选择适合的分词器。
- 应用场景:例如,中文分词可以选择 IK 分词器,而英文可以选择 Standard 分词器。
- 性能:有些分词器可能性能较差,特别是在处理大量数据时,需要根据应用需求做优化。
- 查询需求:如果是为了支持前缀搜索,可以选择 NGram 分词器。
5. 总结
Elasticsearch 提供了多种分词器,适应不同的文本数据和查询需求。在实际使用中,可以根据需求选择合适的分词器,也可以通过自定义分析器来组合不同的分词器和过滤器,从而实现更灵活和精细的搜索功能。
type:keyword
在 Elasticsearch 中,"type": "keyword"
是一种字段类型,它表示该字段的内容应该被索引为 关键词,即精确值而不是分词后的文本。
具体到你提供的这段代码:
json
"properties": { "apply_date": { "type": "keyword" }, "type": "keyword" }
-
"apply_date": { "type": "keyword" }
表示字段apply_date
会被当作精确的关键词进行存储和索引。这通常用于存储如日期、标签、ID等,不需要进行分词和分析的字段。比如如果你查询apply_date: "2025-02-24"
,它会精确匹配这个日期,而不会做分词处理。 -
"type": "keyword"
出现两次,可能是代码中的一处错误或不完整的示例。在这里,"type": "keyword"
需要配合具体的字段来使用,它不应直接作为顶层属性。如果你在索引的字段定义中出现了"type": "keyword"
这样的情况,通常意味着该字段是一个 字符串类型 的精确匹配字段。
如果你想定义多个字段,你应该使用类似以下的结构:
json
"properties": { "apply_date": { "type": "keyword" }, "status": { "type": "keyword" } }
这表示 apply_date
和 status
都是精确匹配的字段,不会进行分词处理。


2025-02-24 09:04:58
es一般定义几个节点,几个分片,几个副本,创建索引时,分片怎么设置
2025-02-24 09:05:01
在 Elasticsearch (ES) 中,创建索引时需要配置节点、分片和副本的数量。以下是一些常见的设置和最佳实践:
1. 节点数量 (Nodes)
- 生产环境 :通常会有多个节点以确保高可用性和负载均衡。典型的生产环境中,至少有 3 个节点。
- 单节点:适用于开发或测试环境,但不推荐用于生产。
- 3 个节点:在生产环境中,通常配置 3 个节点来确保高可用性,这样即使一个节点故障,集群仍能正常运行。
- 更多节点:如果数据量非常大或需要更高的计算能力,可以增加节点的数量。
2. 分片数量 (Shards)
-
分片是 Elasticsearch 将数据分散到不同节点上的单位,决定了索引如何被分割和分配。
-
默认值:每个索引默认有 5 个主分片(primary shards)。
-
如何选择分片数量:
- 根据数据量来选择。如果数据量不大,5 个分片通常是足够的。如果预计数据量会很大或有很高的查询吞吐量,可能需要更多分片。
- 分片的数量要适中,因为太多的分片会导致管理的复杂性,太少的分片则可能无法有效分布数据。
一般推荐:
- 对于小型数据集,可能选择 1-3 个分片。
- 对于大规模的数据集,可能选择 10 个分片甚至更多。
3. 副本数量 (Replicas)
- 副本是每个主分片的复制品,用于提高查询性能和容错性。
- 默认值:每个主分片默认有 1 个副本(即 2 个副本副本+主分片)。
- 如何选择副本数量 :
- 如果集群有足够的节点,可以增加副本数量以提高读取性能。
- 每个副本增加查询吞吐量,但会消耗更多的磁盘空间。
- 在生产环境中,通常至少配置 1 个副本(即每个主分片有一个副本),确保数据冗余和高可用。
4. 创建索引时的分片设置
创建索引时,通常需要指定分片和副本的数量。以下是一个创建索引时的设置示例:
json
PUT /my_index { "settings": { "number_of_shards": 3, // 设置分片数为 3 "number_of_replicas": 1 // 设置副本数为 1 } }
在这个例子中:
number_of_shards
: 3 个主分片。number_of_replicas
: 每个主分片有 1 个副本。
总结
- 节点数量:在生产环境中,至少有 3 个节点。
- 分片数量:默认 5 个分片,根据数据量和查询吞吐量来调整,一般设置为 1-10 个分片。
- 副本数量:默认每个主分片有 1 个副本,增加副本提高容错性和查询性能。
这些设置需要根据具体的应用场景、数据量和查询需求来调整。
3个节点,5分片怎么分配的
在 Elasticsearch 中,当你创建一个索引并指定了 3 个节点和 5 个主分片时,Elasticsearch 会根据分片的数量和节点的数量来自动分配这些分片。通常情况下,分片会尽量均匀地分配到各个节点上。
假设你有 3 个节点(Node1
, Node2
, Node3
)和 5 个主分片(shard_0
, shard_1
, shard_2
, shard_3
, shard_4
),并且假设副本数为 1(每个主分片有 1 个副本)。分配的过程可能会如下所示:
分配示例(3 节点,5 分片,1 副本):
主分片/副本 | 节点 1 | 节点 2 | 节点 3 |
---|---|---|---|
shard_0 | 主分片 | 副本 | |
shard_1 | 主分片 | 副本 | |
shard_2 | 主分片 | 副本 | |
shard_3 | 副本 | 主分片 | |
shard_4 | 主分片 |
说明:
-
主分片 (Primary Shards):每个主分片会被分配到集群中的不同节点,以实现数据的分布。
shard_0
在节点 1 上,shard_1
在节点 1 上,shard_2
在节点 2 上,shard_3
在节点 2 上,shard_4
在节点 3 上。
-
副本分片 (Replica Shards):副本分片是主分片的冗余拷贝,副本会被分配到其他节点上。副本会尽量与主分片分配到不同的节点上。
shard_0
的副本会分配到节点 2。shard_1
的副本会分配到节点 3。shard_2
的副本会分配到节点 3。shard_3
的副本会分配到节点 1。shard_4
的副本会分配到节点 1。
如何分配:
- 在 Elasticsearch 中,分片的分配是由集群的 分片分配算法 动态计算的,旨在确保数据均匀分布在所有节点上并最大限度地提高可用性。
- 在节点数大于分片数的情况下,某些节点可能没有主分片,但会有副本分片。例如,在 3 个节点和 5 个主分片的情况下,会出现 2 个节点负责更多的主分片,而第三个节点则可能负责更多的副本分片。
注意事项:
- 如果你增加副本数量(例如设置为 2 个副本),那么每个主分片就会有两个副本,分片的分配会更加复杂,并且会增加磁盘存储和内存使用。
- 分片的分配是动态的,当节点加入或离开集群时,Elasticsearch 会重新平衡分片,以保证数据均匀分布。
这个分配策略是根据集群的负载和资源动态调整的,所以不同的情况下,具体的分片分配可能会有所不同。