Solr DataImportHandler:我可以使用 XPathEntityProcessor 从 xml 属性获取动态字段名称吗?

发布于 2024-11-29 14:31:40 字数 680 浏览 1 评论 0原文

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

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

在这个 xml 片段中,我想添加一个名为 reference.foo 和值 bar 的字段。 DataImportHandler 包括用于处理 XML 文档的 XPathEntityProcessor。我尝试过使用它,如果我给它一个已知的列名称(例如 ),它就会完美地工作但无法找到任何文档或示例来建议如何做我想做的事,或者无法完成它。那么:

  • 我可以使用 XPathEntityProcessor 来做到这一点吗?如果是这样,怎么办?
  • 如果没有,我可以使用 DataImportHandler 以其他方式执行此操作吗?
  • 或者我是否需要编写自己的导入处理程序?

I have some XML to ingest into Solr, which sounds like a use case that is intended to be solved by the DataImportHandler. What I want to do is pull the column name from one XML attribute and the value from another attribute. Here is an example of what I mean:

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

From this xml snippet, I want to add a field with name reference.foo and value bar. The DataImportHandler includes a XPathEntityProcessor for processing XML documents. I've tried using it and it works perfectly if I give it a known column name (e.g, <field column="ref" xpath="/document/data/@ref">) but have not been able to find any documentation or examples to suggest either how to do what I want, or that it cannot be done. So:

  • Can I do this using XPathEntityProcessor? If so, how?
  • If not, can I do this some other way with DataImportHandler?
  • Or am I left with writing my own import handler?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

生生漫 2024-12-06 14:31:40

我还没有找到一种在不引入变压器的情况下做到这一点的方法,但通过使用一个简单的 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>
...

希望对某人有帮助!

请注意,如果您的动态字段是多值的,则必须迭代 theKey,因为 row.get("theKey") 将是一个列表。

I haven't managed to find a way to do this without bringing in a transformer, but by using a simple ScriptTransformer I worked it out. It goes something like this:

...
<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>
...

Hope that helps someone!

Note, if your dynamicField is multivalued, you have to iterate over theKey since row.get("theKey") will be a list.

自在安然 2024-12-06 14:31:40

您想要做的是选择基于属性值的节点。

从你的例子来看,你会这样做:

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

What you want to do is select the node keying on an attribute value.

From your example, you'd do this:

<field column="ref" xpath="/document/data[@ref='reference.foo']"/>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文