【问题标题】:Full Outer Join in SolrSolr 中的完全外连接
【发布时间】:2019-12-11 23:34:54
【问题描述】:

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


    【解决方案1】:

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

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

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

    这将允许您set up two stream sources,然后申请a leftOuterJoinan 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"
    )
    

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

    【讨论】:

    • 谢谢@MatsLindh,这对我有用。这也适用于嵌套文档吗?除了leftOuterJoin 之外,我一直在尝试应用过滤器来维护文档的嵌套结构,但无法做到。
    • 抱歉,我对嵌套文档一点也不熟悉。
    • 嗨兄弟@MatsLindh。很抱歉现在很晚才发表评论。我有一个关于分页流表达式的问题。现在还有机会吗?
    • @DucAnhPham 如果您有问题,请创建一个适当的问题
    猜你喜欢
    • 2010-09-20
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 2013-03-11
    • 2022-01-01
    • 2022-01-16
    相关资源
    最近更新 更多