Solr DIH能做原子更新吗`

Solr DIH能做原子更新吗`,solr,dih,Solr,Dih,Solr4能够对索引中的现有文档进行原子(部分)更新。即,可以匹配文档ID并仅替换一个字段的内容,或向多值字段添加更多条目: 原子更新可以从DataImportHandler(DIH)完成吗?我通过反复试验发现,ScriptTransformer的答案是“是” Solr文档展示了如何使用“set”、“add”或“inc”向字段节点添加更新属性。如果我创建了一个带有必需的update属性的测试XML文件,那么它在传递给常规更新处理程序时可以正常工作。但是,当传递给DIH时,即使没有任何转换,更新属

Solr4能够对索引中的现有文档进行原子(部分)更新。即,可以匹配文档ID并仅替换一个字段的内容,或向多值字段添加更多条目:

原子更新可以从DataImportHandler(DIH)完成吗?

我通过反复试验发现,ScriptTransformer的答案是“是”

Solr文档展示了如何使用“set”、“add”或“inc”向字段节点添加更新属性。如果我创建了一个带有必需的update属性的测试XML文件,那么它在传递给常规更新处理程序时可以正常工作。但是,当传递给DIH时,即使没有任何转换,更新属性也会被完全忽略

这里是脚本转换器的简化版本,我使用它重新引入update属性并使原子更新工作。注意Java HashMap的使用

var atomicTransformer = function (row) {
    var authorMap = new java.util.HashMap();
    var author = String(row.get('author'));
    authorMap.put('add', author);
    row.put('author', authorMap);
};
这将在DIH调试模式下生成以下JSON:

{
    "id": [
        123
    ],
    "author": [
        {
            "add": "Smith, J"
        }
    ]
}
多值字段也没有问题:将ArrayList而不是字符串传递给HashMap

var atomicTransformer = function (row) {
    var fruits = new java.util.ArrayList();
    fruits.add("banana");
    fruits.add("apple");
    fruits.add("pear");
    var fruitMap = new java.util.HashMap();
    fruitMap.put('add', fruits);
    row.put('fruit', fruitMap);
}