在Solr数据导入处理程序中定义嵌套实体

在Solr数据导入处理程序中定义嵌套实体,solr,Solr,让我先说一下,我已经看过了关于这个主题的所有我能找到的东西,包括Solr文档和所有的SO问题 我有一个Solr实例,我用一个数据导入Hanlder设置它,使用JDBC驱动程序从MSSQL中提取数据。数据进来了,但它的结构并不像我期望的那样基于Solr-DIH文档 <document> <entity> <entity /> </entity> </document> 当我在寻找 docs [ { recordId: '12

让我先说一下,我已经看过了关于这个主题的所有我能找到的东西,包括Solr文档和所有的SO问题

我有一个Solr实例,我用一个数据导入Hanlder设置它,使用JDBC驱动程序从MSSQL中提取数据。数据进来了,但它的结构并不像我期望的那样基于Solr-DIH文档

<document>
 <entity>
  <entity />
 </entity>
</document>
当我在寻找

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请求处理程序,但它什么也没做。我将其添加到/update requestHandler中,得到了一个错误。我不知道那应该去哪里。它是否仅在查询期间有效,还是仅在通过/update将数据推送到solr时有效

在哪里定义文档的结构?我尝试了模式中的嵌套字段、DIH配置中的实体以及RequestHandler中的块连接。还没有任何效果


很明显我错过了什么

DIH不生成嵌套文档。Solr支持它们,但DIH还不能生成它们

DIH中的嵌套实体能够合并源,并且能够基于来自不同源的迭代创建实体。例如,如果外部实体读取文件名,而内部实体从这些文件加载内容,每个文件都有自己的记录


您现在可能想将嵌套的目标代码移动到使用SolrJ的客户端。

从Solr 5.1开始,最终支持在DIH中索引嵌套文档

只需将
child=true
添加到子实体中,Solr DIH就会自动将索引作为子文档

来自JIRA的示例(在上面的链接中):


注意,如果设置了
child=“true”
,则如果
epw.getEntity().isChild()将返回true,因此,它正在创建一个新的
DocWrapper
并添加为子文档,而不是简单地将实体添加为一组新字段。

是否可以将格式化文档推送到Solr并以相同的方式存储它?您可以将嵌套的格式化文档推送到Solr,但它们需要采用Solr理解的格式:。您可能还对Solr的SIREn附加组件感兴趣:
<add>
 <doc>
  <field />
  <doc>
   <field />
  </doc>
 <doc>
</add>
<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>
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);
    }
}