分布式配置中的SOLR联接查询



我正在运行SOLR4并运行一些联接查询,例如-{!join from=some_id to=another_id}(a_id:55 AND some_type_id:3)

当我运行SOLR4的单个实例(不是云)时,这个查询返回4个结果,这正是它应该有的样子

但当我在SOLR云上运行它时,有两个碎片和两个副本,它只返回一个结果,而如果直接按id搜索,则可以在索引中找到另外3个结果。

有什么问题和/或如何解决的想法吗?

提前感谢!

Join仅在shard中工作。Join在碎片之间不起作用。我认为一个碎片应该有3个符合条件的文档,而另一个碎片则应该有一个。复杂的碎片连接尚未到来。

如果您想将join作为强制功能,那么可以考虑将具有多个复制的单个shard作为解决方案。

在Solr中创建碎片时,可以将路由器设置为compositeId,在为文档编制索引时,可以在ID属性中插入ID前缀,这将帮助Solr为文档选择碎片。换句话说,具有相同ID前缀的所有文档都将存储在单个碎片上。虽然你不能用它来告诉Solr到底要使用哪个碎片,但你可以指示需要存储在单个碎片上的文档。

例如,如果为Posts和Comments编制索引,则Post的ID属性可能看起来像POSTDATA123!Post 123,其中123是Post ID。当为属于ID为123的Post的Comment编制索引时,ID属性可能是POSTDATA123!Comment 321,其中321是Comment ID。Solr将理解两个文档上的前缀POSTDATA123!,并将Post及其Comments存储在单个碎片上。

当索引多个帖子时,Solr仍然会使用碎片,并将你的帖子均匀地分布在可用的碎片上,但联接会起作用,因为注释将始终存储在与其父帖子相同的碎片上。

你可以在这里找到更多关于compositeId路由器的文档https://lucene.apache.org/solr/guide/6_6/shards-and-indexing-data-in-solrcloud.html

最新更新