拓冰建站拓冰建站
首页 / 资讯中心 / 正文

OpenSearch 2.16.0 版本特性深度解析:新增 Fingerprint 处理器、响应处理搜索管线与动态映射策略

搜索引擎全文检索可观测性数据分析【免费下载链接】OpenSearch Open source distributed and RESTful search engine.项目地址https://gitcode.com/gh_mirrors/op/OpenSearch点击查看免费下载2024 年 7 月 24 日发布的 OpenSearch 2.16.0 是一次功能密度极高的版本迭代它在摄取侧新增了 fingerprint 指纹处理器和批量处理器基类在搜索侧为搜索管线新增了 sort、split 两个响应处理器在映射侧引入了strict_allow_templates动态映射策略同时完成了 Lucene 9.11.1 升级与多项远程存储、工作负载管理Workload Management能力建设。本文以官方发布说明为骨架结合仓库源码逐项解读这些新特性、行为变更与修复帮助你在升级到 2.16.0 后快速掌握新增能力并规避兼容性风险。一、版本概览与整体定位OpenSearch 2.16.0 于 2024-07-24 发布其发布说明release-notes/opensearch.release-notes-2.16.0.md按照 Added新增、Dependencies依赖、Changed变更、Deprecated废弃、Removed移除、Fixed修复六个维度记录了本次迭代的完整变更清单。从整体脉络看本版本的核心方向包括摄取与搜索管线的双向增强新增 fingerprint 摄取处理器新增 sort、split 两个搜索响应处理器并引入AbstractBatchingProcessor批量处理基类动态映射策略扩展新增strict_allow_templates以及配套的false_allow_templates动态选项远程存储与分层存储持续演进远程存储低优先级上传限流、shard-diff 路径优化、hot-to-warm 分层专用部署的 REST/传输层改造工作负载管理WLM进入落地阶段QueryGroup schema 与跨节点 queryGroupId 头传播Lucene 9.11.1 基础库升级及一批依赖版本刷新。下文将按照发布说明的章节顺序对每一项内容做源码级展开。二、Added新增能力逐项解读2.1 Fingerprint 摄取处理器为文档生成稳定指纹本版本为 ingest-common 模块新增了fingerprint处理器对应 PR #13724用于基于指定的一个或多个字段生成哈希值并写入目标字段。该处理器非常适合去重、变更检测、数据血缘追踪等场景——你可以对一批文档的相同字段集合计算指纹从而快速识别内容是否发生变化。在源码 FingerprintProcessor.java 中其配置参数定义如下参数类型默认值说明fields字符串数组无用于生成指纹的字段列表与exclude_fields互斥exclude_fields字符串数组无排除字段列表除这些字段外的其余字段参与指纹计算target_field字符串fingerprint存放指纹结果的目标字段hash_method字符串SHA-12.16.0哈希算法可选MD52.16.0、SHA-12.16.0、SHA-2562.16.0、SHA3-2562.16.0ignore_missing布尔false指定字段不存在时为true则跳过该字段为false则抛异常一个典型的配置示例如下{ description: 为日志文档生成指纹, processors: [ { fingerprint: { fields: [message, level, host], target_field: doc_fingerprint, hash_method: SHA-2562.16.0, ignore_missing: true } } ] }从源码实现可以看到几个值得注意的设计细节字段名去重与排序execute()方法会对参与计算的字段做distinct()与sorted()确保无论字段声明顺序如何只要字段集合相同指纹结果就一致FingerprintProcessor.java元数据字段豁免_index、_id、_routing等元数据字段会被自动过滤不参与指纹计算避免因写入目标不同导致指纹漂移嵌套对象扁平化Map 类型的字段值会通过toFlattenedMap()递归扁平化为a.b形式的键如{a: {b: 1}}→a.b: 1再按键排序拼接FingerprintProcessor.java稳定的拼接格式拼接串形如|field|value.length:value|最终指纹写为hashMethod : Base64(hash)哈希方法带版本后缀HASH_METHODS集合中的方法名统一带有2.16.0后缀FingerprintProcessor.java源码注释明确指出若未来版本修改处理逻辑应同步递增版本号以保证同一哈希方法在不同版本间不会静默产生不同结果——这保证了指纹的长期稳定性也提醒使用方在升级后如需保持旧指纹兼容应继续使用带旧版本后缀的方法名线程安全MessageDigest非线程安全因此HashMethod枚举通过 supplier 每次调用获取全新的 ThreadLocal 实例避免多摄取线程并发共享导致哈希错误。与之配套的单元测试位于 FingerprintProcessorTests.java 与 FingerprintProcessorFactoryTests.java覆盖了 fields/exclude_fields 互斥校验、非法哈希方法报错、嵌套字段扁平化等行为。2.2 搜索管线新增响应处理器sort 与 split本版本为 search-pipeline-common 模块的搜索管线新增了两个响应阶段处理器response processorsortPR #14785与splitPR #14800。它们运行在搜索请求返回之后、结果返回给客户端之前允许你在服务端直接改写响应内容减少客户端后处理负担。SortResponseProcessor类型名sort源码见 SortResponseProcessor.java参数类型默认值说明field字符串必填要排序的数组字段order字符串asc排序方向asc或desctarget_field字符串与field相同排序结果写入的字段不设置则原地覆盖示例管线配置{ description: 对响应中的 tags 数组按降序排序, response_processors: [ { sort: { field: tags, order: desc } } ] }从源码看该处理器会遍历每个 SearchHit同时对hit.getFields()中的 doc values 字段和_source中的对应字段做排序getSortedValues()会把值先降级为Comparable值不可比如包含 null 或非 Comparable 类型时会抛出带明确提示的异常SortResponseProcessor.java。SplitResponseProcessor类型名split源码见 SplitResponseProcessor.java参数类型默认值说明field字符串必填待拆分的字符串字段separator字符串必填分隔符支持正则表达式preserve_trailing布尔false是否保留末尾的空字符串元素target_field字符串与field相同拆分结果写入的字段示例管线配置{ response_processors: [ { split: { field: csv_line, separator: ,, preserve_trailing: true, target_field: csv_parts } } ] }实现上split直接复用 Java 的String.split(separator, preserveTrailing ? -1 : 0)preserve_trailingtrue时以-1为 limit 保留尾部空串false时以0为 limit 丢弃尾部空串SplitResponseProcessor.java若目标字段不是字符串类型会抛出异常。两者的单元测试分别见 SortResponseProcessorTests.java 与 SplitResponseProcessorTests.java。2.3 动态映射新选项strict_allow_templates本版本为dynamic映射参数新增了strict_allow_templates选项PR #14555并同步引入了配套的false_allow_templates。此前dynamic只有true、false、strict、runtime四种取值true未知字段自动加入映射false忽略未知字段不报错、不入映射strict遇到未知字段直接拒绝文档strict_allow_templates新增未知字段仅当匹配某个动态模板时才被接受否则抛出StrictDynamicMappingException拒绝文档false_allow_templates新增未知字段若匹配动态模板则按模板处理否则静默忽略。在映射解析源码 ObjectMapper.java 中新增了两个枚举值STRICT_ALLOW_TEMPLATES与FALSE_ALLOW_TEMPLATES与原有的STRICT、TRUE、FALSE并列。落地行为位于 DocumentParser.javafindTemplateBuilder()在未找到匹配动态模板时若当前对象的dynamic为STRICT_ALLOW_TEMPLATES则抛出StrictDynamicMappingException。这一策略的实战价值在于当你希望严格控制索引结构拒绝随意新增字段但又允许少量通过动态模板预先定义的半结构化字段如带前缀的日志字段、metric 字段自动落入映射时strict_allow_templates是strict的柔性替代方案。配置示例{ mappings: { dynamic: strict_allow_templates, dynamic_templates: [ { metric_*: { match_mapping_type: long, match: metric_*, mapping: { type: long } } } ] } }上述映射下写入metric_cpu字段会被接受并按 long 建映射而写入未匹配任何模板的foo字段则会抛出strict_dynamic_mapping_exception。相关行为在 DocumentParserTests.java 与 CopyToMapperTests.java 中有完整测试覆盖。2.4 AbstractBatchingProcessor面向批量场景的处理器基类PR #14554 在server模块新增了 AbstractBatchingProcessor.java为需要一次性处理一批文档的摄取处理器提供通用基类。核心设计如下通过batch_size参数控制每批文档数默认值为 1且校验必须是正整数 1时抛出配置异常抽象方法subBatchExecute(ListIngestDocumentWrapper, ConsumerListIngestDocumentWrapper)由具体处理器实现批量处理逻辑batchExecute()负责把传入的文档列表按batch_size切成多个子批次并发提交各子批次并通过AtomicInteger计数器在所有子批次完成后统一回调 handlerAbstractBatchingProcessor.java基类内同时定义了抽象的Factory统一完成batch_size参数解析。该基类的意义在于为后续出现的一类批处理型摄取处理器如批量去重、批量聚合、外部批量 API 调用等提供了标准骨架避免各处理器重复实现切批与并发归并逻辑。其测试见 AbstractBatchingProcessorTests.java。2.5 处理器 Allowlist收窄 ingest-common 与 search-pipeline-common 可用处理器针对多租户与安全加固场景PR #14439 为 ingest-common 和 search-pipeline-common 的处理器注册增加了 allowlist 过滤能力。在 IngestCommonModulePlugin.java 中定义了节点级设置ingest.common.processors.allowed该设置是一个字符串列表默认空。filterForAllowlistSetting()IngestCommonModulePlugin.java在getProcessors()返回注册表前执行过滤若 allowlist 中存在未注册的处理器名会抛出IllegalArgumentException明确指出未知项否则只保留 allowlist 中列出的处理器。search-pipeline-common 侧采用相同的机制见 SearchPipelineCommonModulePlugin.java其配套测试位于 SearchPipelineCommonModulePluginTests.java。典型配置opensearch.ymlingest.common.processors.allowed: [set, rename, fingerprint, grok]配置后未列入清单的处理器如script、json将无法在该节点上被创建适合作为共享集群上的最小权限治理手段。2.6 Workload ManagementQueryGroup Schema 与跨节点传播本版本继续推进工作负载管理WLM能力QueryGroup schemaPR #13669为工作负载组定义了统一的数据模型queryGroupId 头跨节点传播PR #14614为搜索请求增加 queryGroupId 头传播器使查询请求在协调节点与数据节点之间传递时能够携带所属工作负载组标识为后续基于组的资源隔离、限流与调度提供数据基础。对应实现位于plugins/workload-management模块相关的端到端验证可参考 WlmAutoTaggingIT.java 以及 10_workload_group.yml 中的 REST 测试用例。2.7 远程存储与分层存储演进2.16.0 在远程存储Remote Store方向有多项配套优化远程存储低优先级上传限流器PR #14374为 remote store 的低优先级上传引入速率限制避免后台低优任务挤占主路径带宽diff manifest 增加 shard-diff 路径PR #14684通过减少远程存储的读取调用次数来降低延迟remote-routing-table 服务按远程状态接口重构PR #14668将路由表服务与 remote state 接口体系对齐hot-to-warm 分层存储专用部署的 REST/传输层改造PR #13980为独立部署形态的 hot/warm 分层Writable Warm打通请求链路Writable Warm 的 composite directory 实现并与 FileCache 集成PR #12782为可写温存储提供目录抽象层。其中 composite directory 与 FileCache 的集成属于分层存储的底层文件系统抽象为后续把温数据段纳入文件缓存管理奠定了基础。2.8 其他新增项SystemIndexRegistryPR #14415、#14750新增系统索引注册表提供matchesSystemIndex()与matchesPluginSystemIndexPattern()两个辅助方法统一了系统索引的判定逻辑应用配置模板加载 Plugin 接口PR #14659新增 Plugin 级接口允许插件加载基于应用application-based的配置模板date histogram 重写优化应用于 range 聚合PR #13865将 date histogram 的重写优化推广到 range 聚合减少不必要的文档访问父任务取消原因打印PR #14604任务被取消时输出父任务的取消原因提升可观测性TransportNodesAction 优化PR #14749NodeStats、NodesInfo、ClusterStats 请求不再携带 DiscoveryNodes减少传输开销MasterService:run 的 DEBUG 日志降噪PR #14795本地状态 term 版本校验PR #14273所有 ClusterManager 只读传输动作启用本地状态的 term 版本检查增强集群状态一致性保护Cluster Stats Indices 预计算节点级统计PR #14426搜索线程资源使用刷新监听器PR #14832创建监听器以定期刷新搜索线程资源使用情况服务于资源感知调度支持基于 context 字段创建 v2 索引模板PR #14811从搜索定义解析派生字段的竞态条件修复PR #14445该条目虽列入 Added本质是修复解析派生字段时的竞态问题。三、DependenciesLucene 9.11.1 与依赖栈刷新本版本最重要的基础库升级是Apache Lucene 从 9.x 升级到 9.11.1PR #14042、#14576为全文检索、聚合与编解码层带来持续改进。其余主要依赖变更如下依赖变更netty4.1.110.Final → 4.1.111.Finalreactor / reactor-netty3.5.17 → 3.5.19 / 1.1.19 → 1.1.21jackson2.17.1 → 2.17.2opentelemetry1.36.0 → 1.40.0semconv 同步至 1.26.0-alphawiremock-standalone3.3.1 → 3.6.0nimbus-jose-jwt9.37.3 → 9.40commons-net3.10.0 → 3.11.1commons-configuration22.10.1 → 2.11.0azure-identity / msal4j 系列多版本刷新含 azure-storage-common 至 12.25.1mustache.java compiler0.9.13 → 0.9.14json-smart / accessors-smart2.5.0 → 2.5.1com.gradle.develocity3.17.4 → 3.17.5这些依赖的具体锁定版本可对照 gradle/libs.versions.toml 与各模块 licenses 目录下的.jar.sha1文件核实。四、Changed行为变更与动态化调整4.1 indices.query.bool.max_clause_count 改为动态可更新PR #13568 将indices.query.bool.max_clause_count从静态设置需重启节点改为动态可更新。这意味着集群运行期间可以通过PUT _cluster/settings直接调整布尔查询的最大子句数上限无需重启显著降低了调优成本。从源码看该值通过SearchService的动态设置更新回调传播到 LuceneIndexSearcher的静态字段查询构建时再读取生效值。以 terms lookup 子查询为例TermsQueryBuilder.java 会同时读取max_terms_count、max_result_window与IndexSearcher.getMaxClauseCount()取三者最小值作为拉取上限避免子查询结果超过任何一项限制SearchService.java 是该项动态设置的核心承载位置。升级后如需调整上限可直接执行PUT /_cluster/settings { transient: { indices.query.bool.max_clause_count: 2048 } }4.2 其余行为变更Tiered Caching 查询重计算移出写锁PR #14187将查询重算逻辑从写锁内移出降低写路径持锁时间改善并发吞吐unsignedLongRangeQuery 边界语义修正PR #14416当下界大于上界时直接返回MatchNoDocsQuery而不是空结果或异常CommunityIdProcessor 设为 finalPR #14448禁止外部继承该处理器类InternalApi 注解能力扩展PR #14575、#14597允许在不应由核心外部构造的类上使用InternalApi并将其纳入 japicmp API 兼容性检查的排除清单reroute 迭代限时PR #14848为大规模分片分配场景下的 reroute 迭代设置时间上限避免单次分配循环过长refreshAllIndices 允许系统索引警告PR #14635测试框架层面放宽对系统索引刷新的告警。五、Deprecated 与 Removed废弃与移除废弃 bulk API 的batch_size参数PR #14725bulk 请求体中的batch_size参数被标记为废弃建议使用其他批量控制手段该参数未来版本将被移除移除 query categorization 变更PR #14759撤销此前对查询分类query categorization的相关改动。六、Fixed值得关注的修复亮点发布说明共记录 20 项修复以下按业务影响面分类说明查询与映射正确性match_phrase_prefix_query在多值 text 字段 index_prefixes组合下失效的问题PR #10959得到修复FuzzyQuery 在 keyword 字段上同时启用 index 与 doc_values 时会退化为 IndexOrDocValuesQuery 的问题PR #14378ScriptProcessor 摄取管线对 Short/Byte 类型处理异常PR #14379WKT 格式解析器改为迭代实现规避递归栈风险PR #14086FilterPath.parse 与 Grok.validatePatternBank 同样改为迭代式实现PR #14200、#14206。聚合与索引带子 NestedAggregator 的 NestedAggregator 聚合结果错误PR #13324InternalHistogram 添加空桶时引入 circuit breaker 保护PR #14754集群最大分片数计算避免 int 溢出PR #14155。摄取与写入bulk upsert 在自动创建索引命中索引模板时忽略default_pipeline与final_pipeline的问题PR #12891创建索引时index.number_of_replicas为 null 触发 NPEPR #14812快照 searchable snapshot 索引时未写分片级元数据 blobPR #13190多部分上传创建新的 IndexInputPR #14888searchable snapshot 配合 scripted fields 失败PR #14411。API 与稳定性rest-high-level client 的searchTemplate与mtermVectors端点缺少前导斜杠PR #14465create/update alias API 未对不支持的参数抛异常PR #14719GetResult 缺少found字段时 NPEPR #14552ReplicaShardAllocator NPEPR #14385SBP 取消逻辑缺陷PR #13259fs info 报告负可用空间PR #11573ListPitInfo 增加getKeepAlive()getterPR #14495_cat帮助输出更新PR #14722。七、升级与使用建议综合以上变更从 2.15 及更早版本升级到 2.16.0 时建议重点关注兼容性提示indices.query.bool.max_clause_count已动态化原先依赖重启生效的自动化脚本可改为热更新bulk的batch_size已废弃排查现有客户端是否仍在使用并尽快迁移新能力接入指纹去重可直接使用fingerprint处理器需要服务端改写响应时优先考虑搜索管线的sort/split响应处理器严格控制映射结构可启用strict_allow_templates安全治理多租户共享集群可通过ingest.common.processors.allowed等 allowlist 设置收窄可用处理器面底层升级验证Lucene 9.11.1 与 netty、jackson、opentelemetry 等依赖均有升级建议升级前在测试环境跑一遍聚合、检索与摄取回归特别是使用了 FuzzyQuery、match_phrase_prefix、嵌套聚合与 searchable snapshot 的场景可观测性父任务取消原因打印与 ClusterStats 传输优化可帮助更快速地定位任务取消与节点统计问题。本文涉及的源码与测试文件均可直接在仓库中查看fingerprint 处理器实现见 FingerprintProcessor.java响应处理器见 SortResponseProcessor.java 与 SplitResponseProcessor.java动态映射策略见 ObjectMapper.java 与 DocumentParser.java批量基类见 AbstractBatchingProcessor.java处理器 allowlist 见 IngestCommonModulePlugin.java。发布说明原文见 release-notes/opensearch.release-notes-2.16.0.md。赞分享搜索引擎全文检索可观测性数据分析【免费下载链接】OpenSearch Open source distributed and RESTful search engine.项目地址https://gitcode.com/gh_mirrors/op/OpenSearch点击查看免费下载相关推荐napi-rs与Node-API版本映射特性检测与降级处理napi rs与Node API版本映射特性检测与降级处理 Node API简称N API是Node.js提供的跨版本二进制接口允许原生插件在不同Nod开发工具后端鸿蒙应用版本管理应用更新与特性灰度发布策略鸿蒙应用版本管理应用更新与特性灰度发布策略 你是否曾因应用更新导致用户体验下降而头疼是否想逐步推出新功能以降低风险本文将详细介绍鸿蒙HarmonyOS示例工程CachyOS内核新手入门5分钟了解三大调度器BORE/EEVDF/BMQ差异CachyOS内核新手入门5分钟了解三大调度器BORE/EEVDF/BMQ差异 CachyOS是基于Arch Linux的优化内核项目通过不同的调度器和性能操作系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门