4

我有一些 XML 要摄取到 Solr 中,这听起来像是一个打算由 DataImportHandler 解决的用例。我想要做的是从一个 XML 属性中提取列名并从另一个属性中提取值。这是我的意思的一个例子:

<document>
  <data ref="reference.foo">
    <value>bar</value>
  </data>
</document>

从这个 xml 片段中,我想添加一个带有 namereference.foo和 value的字段bar。DataImportHandler 包括一个用于处理 XML 文档的 XPathEntityProcessor。我已经尝试过使用它,如果我给它一个已知的列名(例如,<field column="ref" xpath="/document/data/@ref">),它可以完美地工作,但无法找到任何文档或示例来建议如何做我想要的,或者它不能完成。所以:

  • 我可以使用 XPathEntityProcessor 执行此操作吗?如果是这样,怎么做?
  • 如果没有,我可以使用 DataImportHandler 以其他方式执行此操作吗?
  • 还是我要编写自己的导入处理程序?
4

2 回答 2

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") 将是一个列表。

于 2011-09-09T16:47:03.400 回答
1

您要做的是选择键控属性值的节点。

从您的示例中,您将执行以下操作:

<field column="ref" xpath="/document/data[@ref='reference.foo']"/>
于 2011-09-07T19:56:09.623 回答