2011-08-16 13 views
4

私は、DataImportHandlerで解決しようとするユースケースのように聞こえる、Solrに取り込むXMLをいくつか持っています。私がしたいのは、ある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が複数値の場合、row.get( "theKey")がリストになるため、theKeyを反復処理する必要があります。

1

属性値のノード・キーイングを選択します。あなたの例から

、あなたがこれを行うだろう:

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

これは、 'ref'の値があなたが探しているものがすでに分かっている場合に役立ちます。私の場合、私はその値を知らないので、 'xpath'属性に入れることはできません。しかし、ありがとう! – rathstar

+0

ああ、そうだ。申し訳ありませんが、それはあなたのために有用ではなかったが、あなたがそれを把握してうれしい。 – inanutshellus

関連する問題