2011-08-16 45 views
4

我有一些XML可以摄入到Solr中,这听起来像是一个用于DataImportHandler解决的用例。我想要做的是从一个XML属性和另一个属性的值中提取列名。这里是我的意思的例子:Solr DataImportHandler:我可以从XPathEntityProcessor的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">),但它无法找到任何文档或示例来建议如何执行我想要的操作,或者它无法完成。所以:

  • 我可以使用XPathEntityProcessor来做到这一点吗?如果是这样,怎么样?
  • 如果不是,我可以使用DataImportHandler以其他方式执行此操作吗?
  • 还是我离开写我自己的进口处理程序?

回答

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

你想要做的是选择一个属性值的节点键控。

从你的榜样,你可以这样做:

<field column="ref" xpath="/document/data[@ref='reference.foo']"/> 
+0

如果你已经知道'ref'的值是你想要的值,这会很有帮助。在我的情况下,我不知道这个值,所以我不能把它放在'xpath'属性中。虽然谢谢! – rathstar

+0

哦,我明白了。对不起,这对你没有帮助,但很高兴你知道。 – inanutshellus

相关问题