让我先说一下,我已经找到了关于这个主题的所有内容,包括Solr文档和所有SO问题。
我有一个Solr实例,我使用数据导入Hanlder设置,使用JDBC驱动程序从MSSQL中提取数据。数据进来了,但它并没有根据Solr DIH文档的预期进行结构化
<document>
<entity>
<entity />
</entity>
</document>
我已尝试使用rootEntity,flatten,使用CachedSqlProvider等所有属性。使用multiValued =&#34; True&#34;结果最终
docs [
{
recordId: '1234',
name: 'whatever'
subrows_col1: ['x','y','z']
subrows_col2: ['a','b','c']
}
]
当我正在寻找
时docs [
{
recordId: '1234',
name: 'whatever'
subrows: [{
col1: 'x',
col2: 'a'
},
{
col1: 'y',
col2: 'b'
},
{
col1: 'z',
col2: 'c'
}]
} ]
我已经看到了阻止加入的东西,但我对它的去向感到困惑。我添加了
<add>
<doc>
<field />
<doc>
<field />
</doc>
<doc>
</add>
到DIH requestHandler,但它没有做任何事情。我将它添加到/ update requestHandler,我收到了一个错误。我不知道应该去哪里。它只在查询期间有效吗?还是仅用于通过/ update将数据推送到solr时?
我在哪里定义文档的结构?我尝试了模式中的嵌套字段,DIH配置中的实体以及requestHandlers中的块连接内容。什么都没有效果。
显然我错过了一些东西。
答案 0 :(得分:10)
最终从Solr 5.1开始支持在DIH中索引嵌套文档。
https://issues.apache.org/jira/browse/SOLR-5147
只需将child=true
添加到子实体,然后Solr DIH将自动索引为子文档。
取自JIRA的示例(在上面的链接中):
<document>
<entity name='PARENT' query='select * from PARENT'>
<field column='id' />
<field column='desc' />
<field column='type_s' />
<entity child='true' name='CHILD' query="select * from CHILD where parent_id='${PARENT.id}'">
<field column='id' />
<field column='desc' />
<field column='type_s' />
</entity>
</entity>
</document>
我还在DocBuilder.class
中对solr-dataimporthandler-5.3.0.jar
进行了反编译,发现此代码段: -
if (doc != null) {
if (epw.getEntity().isChild())
{
childDoc = new DocWrapper();
handleSpecialCommands(arow, childDoc);
addFields(epw.getEntity(), childDoc, arow, vr);
doc.addChildDocument(childDoc);
}
else
{
handleSpecialCommands(arow, doc);
addFields(epw.getEntity(), doc, arow, vr);
}
}
注意如果设置epw.getEntity().isChild()
,child="true"
将返回true,因此它会创建新的DocWrapper
并添加为子文档,而不是简单地将实体添加为一堆新领域。
答案 1 :(得分:1)
DIH不会生成嵌套文档。 Solr支持它们,但是DIH还不能生成它们。
DIH中的嵌套实体能够合并源并能够基于来自不同源的迭代创建实体。例如。如果外部实体读取文件名的文件,内部实体从这些文件中加载内容,每个文件都有自己的记录。
您现在可能希望使用SolrJ将嵌套对象代码移动到客户端。