文章目录
- 概要
概要
模板
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.introns.framework.es.builder.OperationsBuilder;
import java.util.HashMap;
import java.util.Map;
abstract class AbstractBuilder<T extends AbstractBuilder<T>> {
protected final Map<String, Object> map;
protected final OperationsBuilder builder;
protected AbstractBuilder(OperationsBuilder builder) {
this.map = new HashMap<>();
this.builder = builder;
}
protected abstract T self();
public OperationsBuilder unwrap() {
return builder;
}
public T set(String key, Object value) {
if (StrUtil.isNotBlank(key) && ObjectUtil.isNotEmpty(value)) {
map.put(map, value);
}
return this.self();
}
public Map<String, Object> build() {
return map;
}
}
import cn.introns.framework.es.builder.OperationsBuilder;
import lombok.extern.slf4j.Slf4j;
/**
* SettingsBuilder<br>
* <a
* href='https://www.elastic.co/guide/en/elasticsearch/reference/7.17/index-modules.html#index-modules-settings'>elasticsearch
* 7.17 document</a>
* @since 3.0.2
*/
@Slf4j
public class SettingsBuilder extends AbstractBuilder<SettingsBuilder> {
@Override
protected SettingsBuilder self() {
return this;
}
public SettingsBuilder(OperationsBuilder builder) {
super(builder);
}
// static index settings
/**
* 设置分片数量<br>
*
* <ul>
* <li>索引应具有的主分片数。默认为1。此设置只能在索引创建时设置。它不能在已关闭的索引上更改
* <li>每个索引的分片数量限制为1024个。此限制是一个安全限制,用于防止意外创建索引,这些索引可能会因资源分配而破坏集群的稳定。可以通过在属于集群的每个节点上指定export
* ES_JAVA_OPTS=“-Des.index.max_number_of_shard=128”系统属性来修改限制
* </ul>
*
* @param value 分片数量
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setNumberOfShards(int value) {
if (value < 0 || value > 1024) {
log.warn("number_of_shards value range [1, 1024], current value {}, do not set", value);
return this;
}
return this.set("number_of_shards", value);
}
/**
* 此设置的默认值取决于索引中主分片的数量。默认设置允许您按2的倍数分割,最多可分割1024个分片<br>
*
* @param value 分片数量
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setNumberOfRoutingShards(int value) {
if (value < 2 || value > 1024) {
log.warn(
"number_of_routing_shards value range [2, 1024], current value {}, do not set", value);
return this;
}
return this.set("number_of_routing_shards", value);
}
/**
* 用于定义索引数据在磁盘上的压缩算法,默认值 LZ4
*
* @param value 压缩算法
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setCodec(String value) {
return this.set("codec", value);
}
/**
* 平衡数据分布优化查询性能<br>
* 取值范围<code>1 <= routing_partition_size < number_of_shards</code>
*
* <ul>
* <li>默认情况下,使用自定义路由的文档会根据路由值的哈希结果分配到唯一主分片,可能导致数据倾斜
* <li>通过设置该值,相同路由值的文档会被分散到多个分片中,缓解数据集中问题
* </ul>
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setRoutingPartitionSize(int value) {
if (value < 0 || value >= 1024) {
log.warn(
"routing_partition_size value range [1, number_of_shards), current value {}, do not set",
value);
return this;
}
return this.set("routing_partition_size", value);
}
/**
* 控制索引软删除功能<br>
* 适用版本<code>6.5.0 ~ 7.6.0</code>
*
* @param value 值
* @return {@link SettingsBuilder}
*/
@Deprecated
public SettingsBuilder setSoftDeletesEnabled(boolean value) {
return this.set("soft_deletes.enabled", value);
}
/**
* 控制软删除记录保留时间,默认值 12h<br>
* 单位支持 h(时) | m(分) | s(秒)<br>
* 适用版本<code>7.6.0 ~</code>
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setSoftDeletesRetentionLeasePeriod(String value) {
return this.set("soft_deletes.retention_lease.period", value);
}
/**
* 控制嵌套查询性能优化行为,默认值 true<br>
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setLoadFixedBitsetFiltersEagerly(boolean value) {
return this.set("load_fixed_bitset_filters_eagerly", value);
}
/**
* 用于在分片启动时执行严格的数据完整性检查,专家级参数<br>
* 可选的值有 false checksum true ,默认值 false
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setShardCheckOnStartup(String value) {
return this.set("shard.check_on_startup", value);
}
// dynamic index settings
/**
* 用于控制每个主分片的副本数量,默认值 1<br>
* 可以调用api动态修改无需重启<br>
*
* <ul>
* <li>推荐至少 1,确保每个主分片至少有一个副本
* <li>副本数应该小于等于集群节点数 - 1,例如3割接点集群最多支持每个主分片2个副本
* </ul>
*
* @param value 副本数量
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setNumberOfReplicas(int value) {
return this.set("number_of_replicas", value);
}
/**
* 用于动态调整索引副本数的配置<br>
*
* <ul>
* <li>范围模式,值 0-5 即副本数在0到5之间自动调整;0-all 即副本数最小0,最大不超过当前节点数 - 1
* <li>默认值 false
* </ul>
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setAutoExpandReplicas(String value) {
return this.set("auto_expand_replicas", value);
}
/**
* 用于控制分片空闲状态的参数,默认值 30s
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setSearchIdleAfter(String value) {
return this.set("search.idle.after", value);
}
/**
* 控制索引刷新频率的核心参数,直接影响数据的实时可见性和写入性能,默认值 1s
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setRefreshInterval(String value) {
return this.set("refresh_interval", value);
}
/**
* 限制分页查询深度,默认值 10000 即当分页查询的起始偏移量(from)与每页大小(size)之和超过该值时,请求会被拒绝<br>
*
* <ul>
* <li>基于经验值,平衡用户体验与系统安全。大多数场景下,用户不会浏览超过前 1000 页(假设每页 10 条)
* </ul>
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setMaxResultWindow(int value) {
return this.set("max_result_window", value);
}
/**
* 用于限制内部命中(inner hits)和聚合(top_hits)结果页深度,默认值 100<br>
* 增大该值会增加内存再用(尤其是聚合或嵌套文档较多时)
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setMaxInnerResultWindow(int value) {
return this.set("max_inner_result_window", value);
}
/**
* 用于限制重评分操作窗口大小,默认值 10000
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setMaxReScoreWindow(int value) {
return this.set("max_rescore_window", value);
}
/**
* 用于限制单个查询中可请求的<code>doc_value_fields</code>数量,以避免因过度资源消耗导致集群性能下降,默认值 100
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setMaxDocValueFieldsSearch(int value) {
return this.set("max_docvalue_fields_search", value);
}
/**
* 用于限制单个查询中通过脚本动态生成字段(script_fields)的数量,以防止因过度计算导致集群性能下降,默认值 32
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setMaxScriptFields(int value) {
return this.set("max_script_fields", value);
}
/**
* 用于控制NGram分词器(NGram Tokenizer)和NGram过滤器(NGram TokenFilter)的最小和最大长度差值的索引级配置<br>
* 限制在 NGram 分词器或过滤器中,min_gram(最小 n-gram 长度)和 max_gram(最大 n-gram 长度)之间的差值上限<br>
* 默认值 1(即 <code>max_gram - min_gram <= 1</code>)
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setMaxNgramDiff(int value) {
return this.set("max_ngram_diff", value);
}
/**
* 用于控制<code>Shingle Token Filter</code>(词片过滤器)中允许的<code>max_shingle_size</code>和<code>
* min_shingle_size</code>最大差值的索引级配置<br>
*
* <uL>
* <li>默认值 3,即<code>max_shingle_size - min_shingle_size <= 3</code>
* </uL>
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setMaxShingleDiff(int value) {
return this.set("max_shingle_diff", value);
}
/**
* 用于控制分片级刷新监听器数量上限的索引级配置,默认值 1000,即elasticsearch 默认将每个分片最多 1000 个监听器<br>
* 限制每个分片上可同时存在的刷新监听器的最大数量
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setMaxRefreshListeners(int value) {
return this.set("max_refresh_listeners", value);
}
/**
* 用于控制<code>_analyze</code> API 分词结果最大数量,默认值 10000,即 10000 个词元<br>
* 限制通过<code>_analyze</code> API 分析文本时,单个请求可生成的词元(Token)的最大数量
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setAnalyzeMaxTokenCount(int value) {
return this.set("analyze.max_token_count", value);
}
/**
* 用于控制高亮功能处理文本长度上线的索引级设置,默认值 1000000 即 1000000 个字符<br>
* 限制在高亮请求中,对单个字段内容进行分析的最大字符数量,超过此限制的文本本分将不会被分析和高亮
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setHighlightMaxAnalyzedOffset(int value) {
return this.set("highlight.max_analyzed_offset", value);
}
/**
* 用于控制<code>Terms Query</code>(多词项精确匹配查询)中允许使用的最大词项数量的索引级配置,默认值 65536 即64k个词项<br>
* 限制<code>Terms Query</code>中一次查询可指定的词项(Terms)的最大数量<br>
* 适用于处理需要匹配大量精确值的查询(如Id过滤、标签匹配等)
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setMaxTermsCount(int value) {
return this.set("max_terms_count", value);
}
/**
* 用于限制正则表达式查询<code>Regexp Query</code>中正则表单时长度的索引级设置,默认值 1000,超过此长度的正则表达式会触发错误<br>
* 限制在<code>Regexp Query</code>中使用正则表单时的最大字符长度,防止因复杂或过长的正则表单时导致性能问题或资源耗尽<br>
* 适用于需要自定义正则表达式复杂度的业务场景,如日志分析,文本模式匹配
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setMaxRegexLength(int value) {
if (value < 0 || value > 32733) {
log.warn("max_regex_length value range [1, 32733], current value {}, do not set", value);
return this;
}
return this.set("max_regex_length", value);
}
/**
* 用于控制默认搜索字段范围,默认值 *<br>
*
* <ul>
* <li>通配符模式
* <li>具体字段名
* <li>字段名数组,多个字段中也可以是具体字段名和统配符模式字段
* </ul>
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setQueryDefaultField(Object value) {
return this.set("query.default_field", value);
}
/**
* 用于控制索引分片分配策略,默认值 all,即允许所有分片被分配到节点(主分片和副分片)<br>
* 可选值 all primaries replicas none
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setRoutingAllocationEnable(String value) {
return this.set("routing.allocation.enable", value);
}
/**
* 用于控制索引分片重新平衡策略,默认值 all,即允许所有分片参与重新平衡(主分片和副分片)<br>
* 可选值 all primaries replicas none
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setRoutingReBalanceEnable(String value) {
return this.set("routing.rebalance.enable", value);
}
/**
* 用于控制已删除文档版本号保留时间的索引设置,默认值 60s<br>
* 单位支持 h(时) | m(分) | s(秒)<br>
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setGcDeletes(String value) {
return this.set("gc_deletes", value);
}
/**
* 用于定义索引文档时默认使用的处理管道设置,默认空<br>
* 可选值 已经存在的管道名称 _none null(空)
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setDefaultPipeline(String value) {
return this.set("default_pipeline", value);
}
/**
* 用于定义索引文档时必须经过的最终处理管道,默认空,不强制使用任何最终管道
*
* <ul>
* <li>特殊值 _none 标识禁用所有管道
* </ul>
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setFinalPipeline(String value) {
return this.set("final_pipeline", value);
}
/**
* 用于控制索引是否默认隐藏,隐藏索引在通配符匹配<code>(GET *)</code>是不会自动返回,需要显式指定<code>expand_wildcards</code>
* 参数才能访问,默认值 false<br>
* 可选值 open closed hidden none all
*
* @param value 值
* @return {@link SettingsBuilder}
*/
public SettingsBuilder setHidden(String value) {
return this.set("hidden", value);
}
}