我正在尝试将多个数据库索引到一个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个文件。
答案 0 :(得分: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版本中已被删除)。