我正在尝试对两个集合进行完整的外部联接。给出
collection1
以及如下所示的文档:
{
id: 234982032,
name: example,
listId: 123
}
和
collection2
的文档如下所示:
{
id: 123,
description: desc1
}
我期望这样的结果:
{
id: 234982032,
name: example,
description: desc1
}
我尝试过使用这个命令:
fq={!join from=listId to=id fromIndex=collection2}description:desc1
但这只会导致内部联接。有没有办法可以使用过滤器查询外部连接两个集合?如果这不可能,有没有可以做到这一点的插件?
(即 {!join}
)的
连接无法从连接两侧检索内容。这些是纯粹的内部联接,其中一个字段用于过滤正在查询的集合中的内容。
这与关系数据库中联接的概念不同,因为没有信息被真正联接。一个适当的 SQL 类比是“内部查询”。如果您使用的是 Solr 的最新版本,您还有另一个选择,那就是
使用流表达式。
这将允许您设置两个流源,然后应用leftOuterJoin或outerHashJoin来获取包含双方信息的文档。
来自参考指南中的示例:
leftOuterJoin(
search(people, q="*:*", qt="/export", fl="personId,name", sort="personId asc"),
search(pets, q="type:cat", qt="/export", fl="personId,petName", sort="personId asc"),
on="personId"
)
outerHashJoin(
search(people, q="*:*", qt="/export", fl="personId,name", sort="personId asc"),
hashed=search(pets, q="type:cat", qt="/export", fl="personId,petName", sort="personId asc"),
on="personId"
)
将问题中的
pets
和
people
替换为
collection1
和
collection2
。请注意,您必须有一个
sort
标准来映射使用
leftOuterJoin
时用于连接的键,但这通常会使连接对于较大的结果大小更有效,因为outerHashJoin 必须在内存中保留更多内容。
innerJoin(搜索(集合1,q =“字段1:值1”,qt =“/导出”,fl =“字段1,字段2,字段3”,排序=“字段1 asc”),搜索(集合2,q =“字段21:值21” " ,qt="/export", fl="field1,field21,field22,field23", sort="field21 asc" ),on="field1")
然后我正在使用 流 = new InnerJoinStream(表达式, 工厂);
如何在此添加第三个集合,即外连接。