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 将必须将整个集合保存在内存中(因为它必须读取流直到结束,然后对文档进行排序) .如果你能通过源本身的文档序列来解决它,它会更有效率。
另一种解决方案是在索引时进行合并;生成统计数据等会更容易
尝试将来自 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 将必须将整个集合保存在内存中(因为它必须读取流直到结束,然后对文档进行排序) .如果你能通过源本身的文档序列来解决它,它会更有效率。
另一种解决方案是在索引时进行合并;生成统计数据等会更容易