Solr 中的全外连接

问题描述 投票:0回答:2

我正在尝试对两个集合进行完整的外部联接。给出

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

但这只会导致内部联接。有没有办法可以使用过滤器查询外部连接两个集合?如果这不可能,有没有可以做到这一点的插件?

java solr lucene solrcloud
2个回答
1
投票
Solr 中使用连接查询解析器

(即 {!join})的

连接无法从连接两侧检索内容。这些是纯粹的内部联接,其中一个字段用于过滤正在查询的集合中的内容。

这与关系数据库中联接的概念不同,因为没有信息被真正联接。一个适当的 SQL 类比是“内部查询”。

如果您使用的是 Solr 的最新版本,您还有另一个选择,那就是

使用流表达式

这将允许您

设置两个流源,然后应用leftOuterJoinouterHashJoin来获取包含双方信息的文档。

来自参考指南中的示例:

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 必须在内存中保留更多内容。 


0
投票
我已经完成了上述工作。但是如何对具有不同连接的三个集合使用相同的方法。 这是我的表情串

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(表达式, 工厂);

如何在此添加第三个集合,即外连接。

© www.soinside.com 2019 - 2024. All rights reserved.