假设我有两种 XML 文档类型,A 和 B,如下所示:
A:
<xml>
<a>
<name>First Number</name>
<num>1</num>
</a>
<a>
<name>Second Number</name>
<num>2</num>
</a>
</xml>
乙:
<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>
但是,我遇到两个问题:
- 我无法获得带有谓词的 XPath 表达式来匹配任何行;无论我是否使用类似的替代方法
/xml/b[aKey=${a.num}]/value
,甚至是硬编码的值aKey
。 - 即使我删除了谓词,解析器也会为 A 中的每一行遍历 B 文件一次,这显然是低效的。
我的问题是:鉴于上面列出的问题,我如何使用 DataImportHandler 正确有效地索引数据?
我正在使用 Solr 3.6.2 。
注意:这有点类似于这个问题,但它处理两种 XML 文档类型,而不是 RDBMS 和 XML 文档。