solr联接核心中的多值字段查询



我在solr中有两个核心,master和child。

主堆芯上的一些样本数据类似

{master_id:1,child_ids:[123,456]}

子核心上的样本数据类似

[{child_id:123,"Name":"ABC Ltd"},{child_id:456,"Name":"xyz ltd"}]

master核心中的child_ids是多值字段,因此name在master核心中包含"s"。

我如何才能加入这两个核心,在那里我会得到像一样的结果

master_id,child_id,name
1,123,"ABC Ltd"
1,456,"xyz ltd"

Solr中的联接查询解析器不能包含联接两边的字段,但通过使用流式表达式,您可以创建一个从两边返回完整文档的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装饰器中。

solr中没有直接连接选项(两个核心之间(。最好的选择是制造一个单芯而不是两个。这可以通过在子核心中添加一个额外的字段(master_id(来实现。

最新更新