Solr 8.9.0如何通过CSV实现Atomic/In-Place更新仅修改指定列
完全可以,Solr 8.9 版本原生支持通过 CSV 实现原子更新,仅修改指定字段、保留其余字段原有内容,不需要合并 CSV 文件也不需要创建多个 core。
前置要求
满足两个基础条件即可使用该能力:
- 你的 Solr core 已配置唯一 ID 作为主键(你已经满足该条件)
- 所有需要保留的字段必须配置为
stored="true",如果想要使用性能更高的In-Place更新,还需要对应字段满足单值、数值/日期类型、开启docValues,不满足也可以正常使用原子更新,只是执行效率稍低。
具体操作方法
有两种常用实现方式,选其一即可:
方式1:修改上传请求参数(无需改动CSV文件)
在原有上传请求的URL后追加参数,给每个CSV中除ID外的字段指定set操作修饰符,告诉Solr仅覆盖这些字段、保留其他字段内容。
以你上传数据源2的命令为例(原命令中的url应为curl笔误,修正后如下):
curl 'http://localhost:8983/solr/Data/update?commit=true&escape=\&encapsulator="&fieldnames=ID,Col3,Col4&f.Col3.fieldUpdateModifier=set&f.Col4.fieldUpdateModifier=set' -T source2.csv -X POST -H 'Content-type:application/csv'
数据源3的上传请求同理,追加f.Col5.fieldUpdateModifier=set和f.Col6.fieldUpdateModifier=set参数即可。
方式2:修改CSV表头(无需改动请求参数)
直接修改对应CSV的表头,给需要更新的字段添加:set后缀,Solr识别到后缀后会自动执行原子更新,不需要修改上传请求的URL参数。
以数据源2为例,修改后的CSV内容如下:
ID,Col3:set,Col4:set 1,8,9
修改后直接用你原有命令上传即可生效。
注意事项
- 如果是批量上传大量CSV文件,建议暂时移除请求中的
commit=true参数,等所有文件上传完成后再统一调用commit接口,能大幅提升上传效率。 - 如果你需要给已有多值字段追加内容而非覆盖,将上述操作中的
set改为add即可。 - 满足In-Place更新条件的字段,Solr会自动启用该优化能力,无需额外配置。
内容的提问来源于stack exchange,提问作者Googlebot
相关产品推荐
相关产品推荐

