如何在solr云中为每个集合使用单核?

如何在solr云中为每个集合使用单核?,solr,solrcloud,Solr,Solrcloud,solr cloud中是否有任何方法将一个集合的数据保留在适当的位置,以便所有索引和搜索查询仅触发到该集合。我在solr join查询中面临一个问题。 假设我有一份文件 { "form_object_id":"a5ec120cd61e41a2a8f05b01edbb8a89", "app_id":2400, "id":"formobj_a5ec120cd61e41a2a8f05b01edbb8a89_account_1704", "

solr cloud中是否有任何方法将一个集合的数据保留在适当的位置,以便所有索引和搜索查询仅触发到该集合。我在solr join查询中面临一个问题。 假设我有一份文件

{
        "form_object_id":"a5ec120cd61e41a2a8f05b01edbb8a89",
        "app_id":2400,
        "id":"formobj_a5ec120cd61e41a2a8f05b01edbb8a89_account_1704",
        "account_id":1704,
        "location_gps_value":"[]",
        "title":"Mumbai",
        "formobject_created_at":"2019-03-31T09:28:40Z",
        "formobject_id":"a5ec120cd61e41a2a8f05b01edbb8a89",
        "Region_2_name":["Maharashtra"],
        "Region_2":["a478ce4bcd7c441c8534849631bebaf8"],
}


In this document i have one field "Region_2" which contains one id "a478ce4bcd7c441c8534849631bebaf8" & this id is present in 208 other solr documents like,

{
        "form_id":26825,
        "form_object_id":"a478ce4bcd7c441c8534849631bebaf8",
        "title":"Maharashtra",
        "location.lat":0.0,
        "location.long":0.0,
        "created_date":"2019-03-31T09:27:55Z",
        "form_name":"Region",
        "type":"assetformobject",
        "id":"formobj_a478ce4bcd7c441c8534849631bebaf8_account_1704",
}
这里的form_object_id与前面文档中的“Region_2”字段相同。 当我加入时

{!join+from=Region_2+to=form_object_id}title:Mumbai
这个查询应该返回208个文档,但它只返回51个,但当我在单核中启动solr时,相同的查询返回所有208个结果。 我认为这可能是因为solr跨多个碎片分发文档。
在solr cloud中有什么方法可以做到这一点吗?

是的,这在solr cloud中是可能的。 如果两个文档不在同一个碎片中,则无法联接。 要使join工作,您必须将每个链接文档保存在同一个碎片中,在您的情况下,如果这两个数据都保存在同一个碎片中,那么join将如我们所期望的那样工作

解决方案1:

在“id”字段前面加上一些常用值,后跟“”!”(感叹号)。从上面的例子来看,“account_1704”似乎是上述文档之间的共同点

如果可能,创建类似“account_1704!_formobj_a5ec120cd61e41a2a8f05b01edbb8a89”和“account_1704!_formobj_A478; CE4BCD7C441C8534849631BEBAF8”的id 这样,这2个文档将永远处于同一个碎片中(理由:SoR会考虑字符串)!对于哈希创建和创建的两个文档都是相同的,所以两个文档将在相同的碎片中路由)

如果无法进行“id”操作,则选择解决方案2

解决方案2:

创建集合时,将router.name设置为“隐式”(默认为compositeId)并将router.field设置为“form\u object\u id”(因为这在文档之间很常见)。
然后这些文档将被存储在同一个shard中,join将起作用。

是的,这在solr云中是可能的。 如果两个文档不在同一个碎片中,则无法联接。 要使join工作,您必须将每个链接文档保存在同一个碎片中,在您的情况下,如果这两个数据都保存在同一个碎片中,那么join将如我们所期望的那样工作

解决方案1:

在“id”字段前面加上一些常用值,后跟“”!”(感叹号)。从上面的例子来看,“account_1704”似乎是上述文档之间的共同点

如果可能,创建类似“account_1704!_formobj_a5ec120cd61e41a2a8f05b01edbb8a89”和“account_1704!_formobj_A478; CE4BCD7C441C8534849631BEBAF8”的id 这样,这2个文档将永远处于同一个碎片中(理由:SoR会考虑字符串)!对于哈希创建和创建的两个文档都是相同的,所以两个文档将在相同的碎片中路由)

如果无法进行“id”操作,则选择解决方案2

解决方案2:

创建集合时,将router.name设置为“隐式”(默认为compositeId)并将router.field设置为“form\u object\u id”(因为这在文档之间很常见)。
然后,这些文档将存储在同一个碎片中,并且join将起作用。

据我所知,这些文档必须存在于同一台服务器上,才能成功进行join。您可以使用以确保相关文档最终位于相同的碎片上。看看这是否有帮助。据我所知,文档必须存在于同一台服务器上才能成功加入。您可以使用以确保相关文档最终位于相同的碎片上。看看这是否有帮助。