Solr DataImportHandler: можно ли получить динамическое имя поля из атрибута xml с помощью XPathEntityProcessor? - PullRequest
4 голосов
/ 16 августа 2011

У меня есть некоторый XML для встраивания в Solr, который звучит как сценарий использования, который предназначен для решения DataImportHandler. То, что я хочу сделать, это извлечь имя столбца из одного атрибута XML и значение из другого атрибута. Вот пример того, что я имею в виду:

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

Из этого фрагмента xml я хочу добавить поле с именем reference.foo и значением bar. DataImportHandler включает XPathEntityProcessor для обработки документов XML. Я попытался использовать его, и он отлично работает, если я назову ему известное имя столбца (например, <field column="ref" xpath="/document/data/@ref">), но не смог найти какую-либо документацию или примеры, чтобы предложить, как делать то, что я хочу, или что он не может быть сделано Итак:

  • Могу ли я сделать это с помощью XPathEntityProcessor? Если да, то как?
  • Если нет, могу ли я сделать это другим способом с DataImportHandler?
  • Или мне осталось написать собственный обработчик импорта?

Ответы [ 2 ]

5 голосов
/ 09 сентября 2011

Мне не удалось найти способ сделать это без ввода трансформатора, но с помощью простого 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 является многозначным, вам придется перебирать ключ, поскольку row.get ("theKey") будетбыть списком.

1 голос
/ 07 сентября 2011

То, что вы хотите сделать, это выбрать ключ узла для значения атрибута.

Из вашего примера вы бы сделали это:

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