Solr DIH可以进行原子更新吗?`

时间:2014-01-08 20:40:44

标签: solr dih

使用Solr 4,可以对索引中的现有文档进行原子(部分)更新。即一个可以匹配文档ID并替换一个字段的内容,或者将更多条目添加到多值字段:http://wiki.apache.org/solr/Atomic_Updates

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

1 个答案:

答案 0 :(得分:9)

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

Solr文档显示了如何使用“set”,“add”或“inc”向字段节点添加更新属性。如果我使用必需的更新属性创建一个测试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);
}