Solr 中的联接查询解析器不能包含联接双方的字段,但通过使用 Streaming Expression,您可以创建一个从双方返回完整文档的 Stream。
提供您正在查看的结果的流式表达式可能是:
hashJoin(
search(joinahoy, q=child_id:[* TO *], fl="child_id,Name", sort="child_id asc"),
hashed=cartesianProduct(
search(joinahoy, q=master_id:[* TO *], fl="master_id,child_ids", sort="master_id asc"),
child_ids
),
on="child_id=child_ids"
)
hashJoin 装饰器接受两个流并返回一个包含两个字段的文档。 hashJoin 会将右侧的完整流(通过hashed 给出)读入内存,然后在将这些值连接到左侧(第一个查询)时查找这些值。
您也许可以使用 innerJoin 装饰器来代替 cartesianProduct 装饰器上的排序规范,但在试验时我无法让它工作。
cartesianProduct 装饰器为主文档的多值字段 (child_ids) 中的每个值返回一个文档。
结果是一组映射到您想要的格式的 JSON 文档:
{
"result-set": {
"docs": [
{
"master_id": 1,
"child_id": 123,
"child_ids": 123,
"Name": [
"ABC Ltd"
]
},
{
"master_id": 1,
"child_id": 456,
"child_ids": 456,
"Name": [
"xyz ltd"
]
},
{
"EOF": true,
"RESPONSE_TIME": 9
}
]
}
}
如果您不想同时返回两个子 id 字段,可以将 hashJoin 包装在 select 装饰器中。