我有一些XML可以摄入到Solr中,这听起来像是一个旨在由DataImportHandler解决的用例。我想要做的是从一个XML属性中提取列名,从另一个属性中提取值。这是我的意思的一个例子:
<document>
<data ref="reference.foo">
<value>bar</value>
</data>
</document>
在此xml代码段中,我想添加名称为reference.foo
且值为bar
的字段。 DataImportHandler包含一个用于处理XML文档的XPathEntityProcessor。我已经尝试过使用它并且如果我给它一个已知的列名称(例如<field column="ref" xpath="/document/data/@ref">
)它可以完美地运行但是却找不到任何文档或示例来建议如何做我想要的,或者那个它无法完成。所以:
答案 0 :(得分:5)
我没有设法在没有引入转换器的情况下找到这样做的方法,但是通过使用简单的ScriptTransformer
我就把它解决了。它是这样的:
...
<script>
function makePair(row) {
var theKey = row.get("theKey");
var theValue = row.get("theValue");
row.put(theKey, theValue);
row.remove("theKey");
row.remove("theValue");
return row;
}
</script>
...
<entity name="..."
processor="XPathEntityProcessor"
transformer="script:makePair"
forEach="/document"
...>
<field column="theKey" xpath="/document/data/@ref" />
<field column="theValue" xpath="/document/data/value" />
</entity>
...
希望能帮助别人!
注意,如果您的dynamicField是多值的,则必须遍历theKey,因为row.get(“theKey”)将是一个列表。
答案 1 :(得分:1)
您要做的是选择键入属性值的节点。
从您的示例中,您可以这样做:
<field column="ref" xpath="/document/data[@ref='reference.foo']"/>