Solr 中的完全外部连接

Full Outer Join in Solr

我正在尝试对两个集合进行完全外部联接。给定 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

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

Solr 中的

A join using the join query parser(即 {!join})无法从连接的两侧检索内容。这些是纯粹的内连接,其中一个字段用于从正在查询的集合中过滤内容。

This is different from the concept of a join in a relational database because no information is being truly joined. An appropriate SQL analogy would be an "inner query".

如果您使用的是最新版本的 Solr,您还有另一个选择,即 using a Streaming Expression

这样您就可以set up two stream sources, then apply either a leftOuterJoin or an 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"
)

用您问题中的 collection1collection2 替换 petspeople。请注意,在使用 leftOuterJoin 时,您必须有一个 sort 条件来映射用于连接的键,但这通常会使连接对于更大的结果大小更有效,因为 outerHashJoin 必须保留很多更多内存。