SOLR加入3个流



试图将3个表中的数据合并为1个表,进行关系数据库连接。加入2个SOLR流可以工作。但是如何加入第三个流呢?

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

Part 1 works:

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"
)

第二部分作品:

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:*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将不得不保持整个集合在内存中(因为它必须读取流直到结束,然后排序文档)据我所知。如果您可以通过源本身的文档序列来解决它,那么它将更加有效。

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

最新更新