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

时间:2014-07-23 20:26:21

标签: solr

让我先说一下,我已经找到了关于这个主题的所有内容,包括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中的块连接内容。什么都没有效果。

显然我错过了一些东西。

2 个答案:

答案 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将嵌套对象代码移动到客户端。