solr - solr 在核心中加入多值字段查询
问题描述
我在 solr 中有两个核心,master 和 child。
主核心上的一些示例数据就像
{master_id:1,child_ids:[123,456]}
子核心上的样本数据就像
[{child_id:123,"Name":"ABC Ltd"},{child_id:456,"Name":"xyz ltd"}]
主核心中的 child_ids 是多值字段,因此名称在主核心中包含“s”。
我怎样才能加入这两个核心,我会得到类似的结果
master_id,child_id,name
1,123,"ABC Ltd"
1,456,"xyz ltd"
解决方案
Solr 中的联接查询解析器不能包含联接双方的字段,但通过使用流式表达式,您可以创建一个从双方返回完整文档的流。
给出您正在查看的结果的流式表达式可能是:
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
推荐阅读
- c++ - 使用嵌套类继承模板类
- php - 在 foreach 循环内的 if 语句中动态创建数组
- visual-studio - 为什么不删除 TFS 中的文件然后重新创建它会清除历史记录?
- unity3d - 如何在游戏开发中组织你的脚本和游戏对象?
- python - 如何读取列表并使用数据创建字典?
- javascript - 需要帮助编写一个接受3个数组并按升序返回一串重复元素的函数
- html - 奇怪的 CSS / z-index 行为
- itext7 - iText7.1 movePage 导致错误:无法在部分刷新的文档中移动页面
- parsing - Parse Error on if statement in Haskell
- python - 如何将文本文件读入数组到熊猫数据框中