SOLR加入3个流

SOLR joining 3 streams

尝试将来自 3 table 的数据合并为 1 table,ala 关系数据库连接。 加入 2 个 SOLR 流有效。但是如何包含第三个流?

顺便说一句。这需要处理数百万行。这是 suitable 方法吗?希望所有数据都不需要加载到内存中。目标是在 solr 中进行大部分处理,而在应用程序中进行较少的处理。

第 1 部分作品:

innerJoin(
        select(
            search(dbv-database-49461a12-8b70-41f0-b5c4-c9b6c84cb5b0,q=tableId:*elevkarakter AND col1_l:166, fl="col0_l,col1_l,col2_t,col4_t,col3_l", sort="col3_l asc"),
            col1_l as elevar,
            col2_t as Termin,
            col4_t as Karakter,
            col3_l as FagkarakterId_fk),
        select(
            search(dbv-database-49461a12-8b70-41f0-b5c4-c9b6c84cb5b0,q=tableId:*fagkarakter, fl="col0_l,col1_l", sort="col0_l asc"),
            col0_l as FagkarakterId,
            col1_l as FagId),       
        on="FagkarakterId=FagkarakterId_fk"
    )

第 2 部分作品:

select(
    search(dbv-database-49461a12-8b70-41f0-b5c4-c9b6c84cb5b0,q=tableId:*fag, fl="col0_l, col5_t", sort="col0_l asc"),
    col0_l as FagId,
    col5_t as fag
)

我可以加入第 1 部分和第 2 部分做这样的事情吗?

innerJoin(
    select(
        search(dbv-database-49461a12-8b70-41f0-b5c4-c9b6c84cb5b0,q=tableId:*fag, fl="col0_l, col5_t", sort="col0_l asc"),
        col0_l as FagId,
        col5_t as fag),
    innerJoin(
            select(
                search(dbv-database-49461a12-8b70-41f0-b5c4-c9b6c84cb5b0,q=tableId:*elevkarakter AND col1_l:166, fl="col0_l,col1_l,col2_t,col4_t,col3_l", sort="col3_l asc"),
                col1_l as elevar,
                col2_t as Termin,
                col4_t as Karakter,
                col3_l as FagkarakterId),
            select(
                search(dbv-database-49461a12-8b70-41f0-b5c4-c9b6c84cb5b0,q=tableId:*fagkarakter, fl="col0_l,col1_l", sort="col0_l asc"),
                col0_l as FagkarakterId,
                col1_l as FagId),       
            on="FagkarakterId"
    ),
    on="FagId"
)

目前的结果:

"EXCEPTION": "Invalid JoinStream - all incoming stream comparators (sort) must be a superset of this stream's equalitor."

联接需要双方按相同的键排序,因此在联接中您返回的不是这种情况 - 因为它是按 FagkarakterId 而不是 FagId 排序的。将这些流想象成文档流,其中左侧流前面的每个文档都被消耗,同时检查另一个流中的前面文档是否匹配连接条件:

对于左侧流中的每个文档,检查 right 头部的文档是否匹配。给定两个流,左和右:

left         right
----         -----
foo          foo
bar          foo
baz          baz

left.pop() -> foo; 

while right.head == foo:
    # pops the next two documents in right

left         right
----         -----
bar          baz
baz          

left.pop -> bar

.. nothing matches in right

left         right
----         -----
baz          baz

left.pop -> baz

while right.head == baz:
    # pops the next document in right

您可以看到此合并策略如何要求两个流按您要加入的相同值排序。

如果您必须对其中一个流进行重新排序,据我所知,Solr 将必须将整个集合保存在内存中(因为它必须读取流直到结束,然后对文档进行排序) .如果你能通过源本身的文档序列来解决它,它会更有效率。

另一种解决方案是在索引时进行合并;生成统计数据等会更容易