Solr 4 提供了对索引中的现有文档进行原子(部分)更新的能力。即可以匹配文档 ID 并仅替换一个字段的内容,或向多值字段添加更多条目:http ://wiki.apache.org/solr/Atomic_Updates
可以从 DataImportHandler (DIH) 完成原子更新吗?
Solr 4 提供了对索引中的现有文档进行原子(部分)更新的能力。即可以匹配文档 ID 并仅替换一个字段的内容,或向多值字段添加更多条目:http ://wiki.apache.org/solr/Atomic_Updates
可以从 DataImportHandler (DIH) 完成原子更新吗?
ScriptTransformer 的答案是“是”,这是我通过反复试验发现的。
Solr 文档展示了如何使用“set”、“add”或“inc”向字段节点添加更新属性。如果我创建一个具有必需更新属性的测试 XML 文件,它在传递给常规更新处理程序时工作正常。但是,当传递给 DIH 时——即使没有任何转换——更新属性也会被完全忽略。
这是我用来重新引入更新属性并使原子更新工作的脚本转换器的简化版本。注意 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);
}