Elasticsearch7——索引模块

2,090 阅读6分钟

[这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战]


索引模块

索引模块是为每个索引创建的模块,定义了与索引相关的所有配置。我们可以为每个索引的设置配置不同的索引级别,分为两种:

  • 静态索引:只能在创建时或在被关闭的索引上设置
  • 动态索引:可对存在的索引在任意进行设置

索引模块的设置分类如下:

test.png

静态索引设置

对主分片进行分片

number_of_routing_shards用于设置文档分片的路由参数

  • Elasticsearch 在拆分索引时使用此值,该参数是index.number_of_shards的整数倍;
  • 此设置的默认值取决于索引中的主分片数量,默认设置允许分片时按2的因子最多拆分成 1024 个分片。

index.number_of_shards用于设置索引的主分片数

  • 默认值为1;
  • 此设置只能在创建索引时设置,不能在关闭的索引上更改;
  • 分片的数量默认最大值为1024,避免分片过多破坏集群的稳定性,可以通过export ES_JAVA_OPTS="-Des.index.max_number_of_shards=128"修改该限制。

路由公式:

routing_factor = num_routing_shards / num_primary_shards  3=30/3
shard_num = (hash(_routing) % num_routing_shards) / routing_factor  (0~9)=(0~29)/3

公式取值:

  • num_primary_shards 取值是index.number_of_shards的值
  • num_routing_shards 取值是number_of_routing_shards的值
  • 默认_routing值是文档的_id,也可以为 每个文档设置routing指定自定义值来实现

通过这个路由公式,可以对主分片进行扩展。图解如下

绘图1.png

自定义路由

添加自定义路由:

PUT my-index-000001/_doc/1?routing=user1&refresh=true 
{
  "title": "This is a document"
}
GET my-index-000001/_doc/1?routing=user1

路由结果: image.png

_id不能保证索引中所有分片的唯一性 。事实上,_id如果使用不同的_routing值进行索引,具有相同的文档可能最终会出现在不同的分片上;需要由用户设置适合的参数保证ID的唯一性。

设置路由参数为必须项:

POST my-index-000002
{
  "mappings": {
    "_routing": {
      "required": true 
    }
  }
}

PUT my-index-000002/_doc/1?routing=user1&refresh=true 
{
  "title": "This is a document2"
}

GET my-index-000002/_doc/1?routing=user1

设置索引的_routing属性为true,如果增删改查不使用routing参数,则会报routing_missing_exception异常。

index.routing_partition_size自定义路由值可以到达的分片数,默认为 1;且只能在创建索引时设置。

当设置该参数后,计算公式发生了变化:

routing_value = hash(_routing) + hash(_id) % routing_partition_size
shard_num = (routing_value % num_routing_shards) / routing_factor

在 Elasticsearch 7.0.0 及更高版本中,此设置会影响文档在分片之间的分布方式。使用自定义路由重新索引旧索引时,必须明确设置index.number_of_routing_shards以保持相同的文档分布

其它

  1. 压缩

index.codec用于设置数据压缩类型,默认值使用 LZ4 压缩来压缩存储的数据,可以设置为Deflate获得更高的压缩率,但会降低存储字段的性能。如果正在更新压缩类型,则将在合并段后应用新的压缩类型。可以使用force merge强制合并分段。

在计算方面,Deflate是一种无损数据的文件压缩格式,结合了LZSS和霍夫曼编码。它是由Phil Katz为他的PKZIP压缩工具的第 2 版设计的。

  1. 软删除

index.soft_deletes.enabled在7.6.0 中已弃用。创建禁用软删除的索引已被弃用,并将在未来的 Elasticsearch 版本中删除。软删除只能在创建索引时配置。

index.soft_deletes.retention_lease.period设置分片的历史记录保留时间,确保在合并 Lucene 索引期间保留软删除,默认为12h

  1. 其它

index.load_fixed_bitset_filters_eagerly 定义是否为嵌套查询预加载缓存过滤器。可能的值为true(默认)和false。

Elasticsearch 会在分片生命周期的各个时间点自动对分片的内容进行完整性检查。index.shard.check_on_startup设置确定 Elasticsearch 在打开分片时是否执行额外的完整性检查。如果这些检查检测到损坏,则它们将阻止打开分片。 相关的取值如下:

取值
false打开分片时不要执行额外的损坏检查,这是默认和推荐的行为
checksum验证分片中每个文件的校验和是否与其内容匹配
true检查物理损坏和逻辑损坏。这是一个昂贵的操作,很耗 CPU 和内存
fix这个选项已经被废弃,在 7.0 以后被永久移除

动态索引设置

动态索引的设置可以使用update-index-settings API在实时索引上更改它们。

标题
index.number_of_replicas每个主分片具有的副本数,默认为 1
index.auto_expand_replicas根据集群中的数据节点数量自动扩展副本数量,默认为false
index.search.idle.after分片在被视为搜索空闲之前无法接收搜索获取请求的时间。(默认为30s)
index.refresh_interval执行刷新操作的频率;默认为1s. 可以设置-1为禁用刷新
index.max_result_windowfrom + size搜索此索引 的最大值,from表示起始数据的序号,size表示数据数。默认为 10000,太小可能导致Result window is too large
index.max_inner_result_window限制返回 结果中的 结果集,默认为100
index.max_rescore_windowdocvalue_fields查询中允许 的最大数量
index.max_docvalue_fields_searchscript_fields查询中允许 的最大数量,默认为32
index.max_script_fieldsscript_fields查询中允许 的最大数量,默认为32
index.max_ngram_diffNGram令牌生成器中的max_gram和min_gram之差必须小于或等于max_script_fields
index.max_shingle_diffshingle令牌过滤器的 max_shingle_size 和 min_shingle_size 之间的最大允许差异,默认为 3
index.max_refresh_listeners索引的每个分片上可用的最大刷新侦听器数
index.analyze.max_token_count可使用 _analyze API 生成的最大令牌数,默认为10000
index.highlight.max_analyzed_offset将为突出显示请求分析的最大字符数
index.max_terms_countTerms查询中可以使用的最大术语数,默认为65536
index.max_regex_length可以在 Regexp Query 中使用的 regex 的最大长度,默认为1000
index.query.default_field匹配一个或多个字段的通配符模式
index.routing.allocation.enable控制此索引的分片分配:all(所有分片)、primaries(主分片)、new_primaries(新创建的主分片)、none(不允许)
index.routing.rebalance.enable为此索引启用分片重新平衡:all、primariesreplicas(副分片)、none
index.gc_deletes文档删除后的保留时间,默认 60S
index.default_pipeline索引 的默认摄取节点管道
index.final_pipeline最终管道
index.mapping.dimension_fields.limit索引的最大时间序列维度数(仅供 Elastic 内部使用)
index.hidden指示默认情况下是否应隐藏索引,默认不隐藏

其他索引设置

在索引模块中可用的其它索引设置:

  • 分析
    • 用于定义分析器、标记器、标记过滤器和字符过滤器的设置。
  • 索引分片分配
    • 控制分片在何处、何时以及如何分配给节点。
  • 映射
    • 启用或禁用索引的动态映射。
  • 合并
    • 控制后台合并过程如何合并分片。
  • 相似之处
    • 配置自定义相似性设置以自定义搜索结果的评分方式。
  • 慢日志
    • 控制记录查询和获取请求的速度。
  • 存储
    • 配置用于访问分片数据的文件系统类型。
  • 跨日志
    • 控制事务日志和后台刷新操作。
  • 历史保留
    • 控制对索引中操作历史记录的保留。
  • 负载压力
    • 配置负载限制。

参考资料

index-modules