使用Solr 4,可以对索引中的现有文档进行原子(部分)更新。即一个可以匹配文档ID并替换一个字段的内容,或者将更多条目添加到多值字段:http://wiki.apache.org/solr/Atomic_Updates
可以从DataImportHandler(DIH)完成原子更新吗?
答案 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);
}