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天期限删除?(已测试该字段可原子更新)
问题解答
无法直接对TTL字段执行原子更新
DocExpirationUpdateProcessorFactory的设计逻辑是在文档写入/更新时,直接读取TTL字段的原始值计算过期时间,但原子更新的语法(如{set=+60DAYS})会被处理器当成完整字符串传递给日期解析器,而非解析出实际TTL值。该处理器不支持解析这种原子更新结构,因此会抛出解析异常,目前官方实现也未适配TTL字段的原子更新场景。仅更新
expire_at_dt字段可有效修改文档过期时间DocExpirationUpdateProcessorFactory最终是通过expire_at_dt字段的值判断是否删除文档——自动删除任务运行时,会检查该字段是否早于当前时间,满足条件则删除文档。既然已确认该字段可原子更新,直接将其修改为新的过期时间(比如用日期语法设置为当前时间+60天),就能覆盖原7天期限,阻止文档被提前删除。
内容的提问来源于stack exchange,提问作者Eric Schoen
相关产品推荐
相关产品推荐

