You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solr使用DocExpirationUpdateProcessorFactory时TTL原子更新问题咨询

Solr DocExpirationUpdateProcessorFactory 原子更新问题

配置信息

我的Solr集合使用了DocExpirationUpdateProcessorFactory,更新请求处理器链配置如下:

<updateRequestProcessorChain default="true">
  <processor class="solr.processor.DocExpirationUpdateProcessorFactory">
      <int name="autoDeletePeriodSeconds">300</int>
      <str name="ttlFieldName">time_to_live_s</str>
      <str name="expirationFieldName">expire_at_dt</str>
    </processor>  
  <processor class="solr.LogUpdateProcessorFactory"/>
  <processor class="solr.RunUpdateProcessorFactory"/>
</updateRequestProcessorChain>

问题现象

尝试对集合中的现有文档执行原子更新以修改TTL(比如把原+7DAYS改为+60DAYS),但无论是用SolrJ还是JSON更新命令都触发400异常,错误响应如下:

{"responseHeader":{"status":400,"QTime":0}, "error":{"metadata":["error-class","org.apache.solr.common.SolrException","root-error-class","java.text.ParseException"],"msg":"Can't parse ttl as date math: {set=+60DAYS}","code":400}}

服务器日志显示,传递给DateMathParser的不是+60DAYS,而是{set=+60DAYS},从而引发解析异常。

咨询问题

  • 更新链包含DocExpirationUpdateProcessorFactory时,能否对TTL字段执行原子更新?
  • 若不可行,仅更新expire_at_dt字段是否可阻止文档按原7天期限删除?(已测试该字段可原子更新)

问题解答

  1. 无法直接对TTL字段执行原子更新
    DocExpirationUpdateProcessorFactory的设计逻辑是在文档写入/更新时,直接读取TTL字段的原始值计算过期时间,但原子更新的语法(如{set=+60DAYS})会被处理器当成完整字符串传递给日期解析器,而非解析出实际TTL值。该处理器不支持解析这种原子更新结构,因此会抛出解析异常,目前官方实现也未适配TTL字段的原子更新场景。

  2. 仅更新expire_at_dt字段可有效修改文档过期时间
    DocExpirationUpdateProcessorFactory最终是通过expire_at_dt字段的值判断是否删除文档——自动删除任务运行时,会检查该字段是否早于当前时间,满足条件则删除文档。既然已确认该字段可原子更新,直接将其修改为新的过期时间(比如用日期语法设置为当前时间+60天),就能覆盖原7天期限,阻止文档被提前删除。


内容的提问来源于stack exchange,提问作者Eric Schoen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:05:19