次のような 2 つの XML ドキュメント タイプ A と B があるとします。
A:
<xml>
<a>
<name>First Number</name>
<num>1</num>
</a>
<a>
<name>Second Number</name>
<num>2</num>
</a>
</xml>
B:
<xml>
<b>
<aKey>1</aKey>
<value>one</value>
</b>
<b>
<aKey>2</aKey>
<value>two</value>
</b>
</xml>
次のようにインデックスを付けたいと思います。
<doc>
<str name="name">First Name</str>
<int name="num">1</int>
<str name="spoken">one</str>
</doc>
<doc>
<str name="name">Second Name</str>
<int name="num">2</int>
<str name="spoken">two</str>
</doc>
したがって、実際には、A の値を B のキーとして使用しようとしています。DataImportHandler を使用して、データ構成定義として以下を使用しました。
<dataConfig>
<dataSource type="FileDataSource" encoding="UTF-8" />
<document>
<entity name="document" transformer="LogTransformer" logLevel="trace"
processor="FileListEntityProcessor" baseDir="/tmp/somedir"
fileName="A.*.xml$" recursive="false" rootEntity="false"
dataSource="null">
<entity name="a"
transformer="RegexTransformer,TemplateTransformer,LogTransformer"
logLevel="trace" processor="XPathEntityProcessor" url="${document.fileAbsolutePath}"
stream="true" rootEntity="true" forEach="/xml/a">
<field column="name" xpath="/xml/a/name" />
<field column="num" xpath="/xml/a/num" />
<entity name="b" transformer="LogTransformer"
processor="XPathEntityProcessor" url="/tmp/somedir/b.xml"
stream="false" forEach="/xml/b" logLevel="trace">
<field column="spoken" xpath="/xml/b/value[../aKey=${a.num}]" />
</entity>
</entity>
</entity>
</document>
</dataConfig>
ただし、次の 2 つの問題が発生します。
- どの行にも一致する述語を含む XPath 式を取得できません。のような代替手段を使用するか
/xml/b[aKey=${a.num}]/value
、ハードコードされた値を使用するかに関係なくaKey
。 - 述語を削除しても、パーサーは A の行ごとに 1 回 B ファイルを調べますが、これは明らかに非効率的です。
私の質問は、上記の問題に照らして、 DataImportHandler を使用してデータを正しく効率的にインデックス化するにはどうすればよいですか?
Solr 3.6.2 を使用しています。
注: これはこの質問に少し似ていますが、RDBMS と XML ドキュメントではなく、2 つの XML ドキュメント タイプを扱っています。