0

我正在尝试将多个数据库索引到一个 solr 索引中。我一直在阅读有关多个数据源的 solr wiki 并尝试使用不同类型的设置,但我无法获得所需的结果。

我的配置如下所示:

<dataConfig>
  <!-- Has 10000 items -->
  <dataSource name="ds1" driver="org.h2.Driver" url="jdbc:h2:file:/path/to/first" />
  <!-- Has ~7000 items -->
  <dataSource name="ds2" driver="org.h2.Driver" url="jdbc:h2:file:/path/to/second" />

  <document name="myDocName">
    <entity name="firstEntity" rootEntity="true" 
            dataSource="ds1" query="SELECT * FROM BLAH"  
            transformer="my.Transformer" threads="4">
      ... <!-- field configuration here -->
    </entity>

    <entity name="secondEntity" rootEntity="true"  
            dataSource="ds2" query="SELECT * FROM BLAH"  
            transformer="my.Transformer" threads="4">
      ... <!-- field configuration here -->
    </entity>
  </document>
</dataConfig>

现在,我们目前正在使用 testdata,所以我知道每个数据库中有多少条记录,第一个包含 ~7000,第二个包含 10000。当我开始索引时,我收到一条信息消息,有 ~17000 个添加:

INFO: {deleteByQuery=*:*,add=[5, 1, 2, 6, 7, 4, 8, 3, ... (17069 adds)],commit=} 0

但是,当我在 Web 界面中运行 * : * 查询时,我只得到 10000 个结果(这正是最大数据库中的项目数。这似乎表明 7096 个文档必须包含其中的实体,而剩下的只有一个。

我试图在配置文件中记录元素,但这导致只有一个被导入(可能是因为它们具有相同的名称,即文档名称=“myDocName”为两个文档元素配置相同)。

在这一点上,我被卡住了,不知道如何正确配置它。我唯一能想到的就是我必须分别索引两个数据库,但我也不清楚这方面的工作流程。任何帮助,将不胜感激。

更新 1:我尝试为这两个实体提供不同的名称(无论如何,这都是根据文档所必需的),但这会导致以下行为。第一个文档从第一个数据库添加,接下来前 N 个现有文档被第二个数据库中的文档覆盖,其中 N 是第二个数据库中的记录数。显然这不是我想要的,我想要 N个额外的文件。在配置中添加第二个文档元素似乎也不起作用。

更新 2:根据此错误报告中的评论:https ://issues.apache.org/jira/browse/SOLR-895 ,文档标签中的根实体应为这些实体生成新文档。这不是我正在发生的事情。在每个实体标签上显式设置 rootEntity="true" 也不会改变任何东西。结果仍然是导入后我只有 10000 个文档,而不是预期的 17000 个。

4

1 回答 1

2

我想你有唯一的键冲突。您在两个不同的数据库中是否有相同的 ID?尝试将查询更改为

 - ds1 - "SELECT "ds1" || id AS id, field1, field2 FROM table1"
 - ds2 - "SELECT "ds2" || id AS id, field1, field2 FROM table2"

我会删除多线程选项(threads="4"),与单线程情况相比没有真正显着的性能改进,而且它不是很稳定(它在 4.0 版本中被删除)。

于 2012-11-06T13:14:49.627 回答