索引合并并不会判断uniqueKey,所以主键有重复不会判断主键会重复。
官方的解释是不要有重复。
要合并索引,它们必须满足以下要求:
- 这两个索引必须兼容:它们的架构应该包含相同的字段,并且它们应该以相同的方式分析字段。
- 索引不得包含重复的数据。
1, Solr 合并索引数据有两种方法,第一种是 1.4 版本中引入的,通过 CoreAdminHandler 来实现,示例如下:
上述命令会将 core1 和 core2 的索引合并到 core0 中去,这里最值得注意的一点是:一旦合并完成,必须在 core0 上调用 commit 操作,否则索引数据的变化对于 searchers 来说是暂时不可见的,只有等到下次 core0 重新装载起来时才可见。
第二种方法是 Solr3.3 中引入的,也是通过 CoreAdminHandler 来实现,示例如下:
http://localhost:8983/solr/admin/cores?action=mergeindexes&core=core0&srcCore=core1&srcCore=core2
同第一种方法一样, 一旦合并完成,必须在 core0 上调用 commit 操作,否则索引数据的变化对于 searchers 来说是暂时不可见的,只有等到下次 core0 重新装载起来时才可见。
使用 ”srcCore” 和 ”indexDir” 这两种方法的区别:
1) 使用 ”indexDir” 参数,你可以合并不是与 Solr 核相关联的索引数据,比如通过 Lucene 直接创建的索引
2) 使用 ”indexDir” 参数,你必须注意索引数据不是直接写入的,这就意味着如果它是一个 solr 核的索引,必须要关闭 IndexWriter ,这样才能触发一个 commit 命令。
3) “indexDir” 必须指向 solr 核所在的主机上的磁盘路径,这就限制比较多了,而相反,你可以只给 srcCore 一个 solr 核的名称,而不关心它的实际索引路径在哪。
4) 使用 ”srcCore” ,你必须确保即使源索引数据同时存在写操作的时候,合并后的索引页不会损坏。
2, solr 索引合并的时候,底层其实调用的还是 Lucene ,因此你 schema.xml 中配置的 uniqueKeys 它并不知道,因此当你对两个包含相同文档(由 uniqueKey 确定)的索引进行合并时,你会得到双倍的文档数, solr 这个地方应该改下,毕竟你不是简单的 Lucene 包装嘛。。。
http://localhost:8080/searchserver/core0/update?commit=true
3,使用lucene的IndexMergeTool合并
java -classpath ./lucene-misc-3.4-SNAPSHOT.jar:./lucene-core-3.4-SNAPSHOT.jar org.apache.lucene.misc.IndexMergeTool mergeIndex ./data/deal/index/ ./data_CJK/deal/index/