带有字段标记关系的 Solr 嵌套文档:单个元素未存储在数组中
Solr Nested Document w/ Field Labelled Relationship: Single Elements Not Stored In Arrays
在为我的数据编制索引时,我发现一些嵌套文档没有正确存储。我 运行 Solr 8.3 并使用 标记的关系 作为 described in the docs.
数据
只要根实体 Parent
有任意数量的 Child
个实体,我就会生成以下 PHP 数组:
[
'id' => 'b14ac9a0-e255-468b-a673-e125fd73d6f2',
'entity_type' => 'parent',
'title_t' => 'Andrea Cook',
'children' => [
0 => [
'id' => 'ce10380c-8006-4945-9078-296116ad5ab7',
'entity_type' => 'child',
'title_t' => 'Jordan Gibson',
],
1 => [
'id' => '0c191119-fae9-452e-aca2-b724a381f939',
'entity_type' => 'child',
'title_t' => 'Jane Gordon',
],
]
]
然后将其编码为以下 JSON 对象:
{
"id": "b14ac9a0-e255-468b-a673-e125fd73d6f2",
"entity_type": "parent",
"title_t": "Andrea Cook",
"children": [
{
"id": "ce10380c-8006-4945-9078-296116ad5ab7",
"entity_type": "child",
"title_t": "Jordan Gibson"
},
{
"id": "0c191119-fae9-452e-aca2-b724a381f939",
"entity_type": "child",
"title_t": "Jane Gordon"
}
]
}
这正是 solr 查询返回的内容(加上自动生成的值 __root__
、__nest_path__
等)。
问题
每当 Parent
只有一个 Child
时,它们最终作为 solr 中的对象,而不是包含单个对象的数组。
预期搜索结果
{
"id": "b14ac9a0-e255-468b-a673-e125fd73d6f2",
"entity_type": "parent",
"title_t": "Andrea Cook",
"children": [
{
"id": "ce10380c-8006-4945-9078-296116ad5ab7",
"entity_type": "child",
"title_t": "Jordan Gibson"
}
]
}
真实搜索结果
{
"id": "b14ac9a0-e255-468b-a673-e125fd73d6f2",
"entity_type": "parent",
"title_t": "Andrea Cook",
"children": {
"id": "ce10380c-8006-4945-9078-296116ad5ab7",
"entity_type": "child",
"title_t": "Jordan Gibson"
}
}
断言
我已经确保 php 数组和 JSON 对象的格式正确,直到它们被传递给 HTTP 客户端。
我已确保 children
数组的数组键已编号并从 0 开始。
问题
这是预期的行为吗?
我是否必须为带标签的关系创建一个 <fieldType/>
(即创建一个多值 children
字段)?如果是,那我该怎么做?我还没有找到任何解释。
如何才能始终在搜索结果中获取 children
的数组,这样我就不必在遍历数据之前检查数据?
我终于想到,我在 PHP(array_map
、array_merge
、...)中编写的数组操作正在创建具有奇怪索引的数组。
为了解决这个问题,我不得不调用 array_values
,它会创建原始的零索引数组。
从我的 updateRequestProcessorChain in solrconfig.xml
中删除 "solr.TrimFieldUpdateProcessorFactory"
解决了我的问题。 (Solr 8.8.1)
在为我的数据编制索引时,我发现一些嵌套文档没有正确存储。我 运行 Solr 8.3 并使用 标记的关系 作为 described in the docs.
数据
只要根实体 Parent
有任意数量的 Child
个实体,我就会生成以下 PHP 数组:
[
'id' => 'b14ac9a0-e255-468b-a673-e125fd73d6f2',
'entity_type' => 'parent',
'title_t' => 'Andrea Cook',
'children' => [
0 => [
'id' => 'ce10380c-8006-4945-9078-296116ad5ab7',
'entity_type' => 'child',
'title_t' => 'Jordan Gibson',
],
1 => [
'id' => '0c191119-fae9-452e-aca2-b724a381f939',
'entity_type' => 'child',
'title_t' => 'Jane Gordon',
],
]
]
然后将其编码为以下 JSON 对象:
{
"id": "b14ac9a0-e255-468b-a673-e125fd73d6f2",
"entity_type": "parent",
"title_t": "Andrea Cook",
"children": [
{
"id": "ce10380c-8006-4945-9078-296116ad5ab7",
"entity_type": "child",
"title_t": "Jordan Gibson"
},
{
"id": "0c191119-fae9-452e-aca2-b724a381f939",
"entity_type": "child",
"title_t": "Jane Gordon"
}
]
}
这正是 solr 查询返回的内容(加上自动生成的值 __root__
、__nest_path__
等)。
问题
每当 Parent
只有一个 Child
时,它们最终作为 solr 中的对象,而不是包含单个对象的数组。
预期搜索结果
{
"id": "b14ac9a0-e255-468b-a673-e125fd73d6f2",
"entity_type": "parent",
"title_t": "Andrea Cook",
"children": [
{
"id": "ce10380c-8006-4945-9078-296116ad5ab7",
"entity_type": "child",
"title_t": "Jordan Gibson"
}
]
}
真实搜索结果
{
"id": "b14ac9a0-e255-468b-a673-e125fd73d6f2",
"entity_type": "parent",
"title_t": "Andrea Cook",
"children": {
"id": "ce10380c-8006-4945-9078-296116ad5ab7",
"entity_type": "child",
"title_t": "Jordan Gibson"
}
}
断言
我已经确保 php 数组和 JSON 对象的格式正确,直到它们被传递给 HTTP 客户端。
我已确保 children
数组的数组键已编号并从 0 开始。
问题
这是预期的行为吗?
我是否必须为带标签的关系创建一个 <fieldType/>
(即创建一个多值 children
字段)?如果是,那我该怎么做?我还没有找到任何解释。
如何才能始终在搜索结果中获取 children
的数组,这样我就不必在遍历数据之前检查数据?
我终于想到,我在 PHP(array_map
、array_merge
、...)中编写的数组操作正在创建具有奇怪索引的数组。
为了解决这个问题,我不得不调用 array_values
,它会创建原始的零索引数组。
从我的 updateRequestProcessorChain in solrconfig.xml
中删除 "solr.TrimFieldUpdateProcessorFactory"
解决了我的问题。 (Solr 8.8.1)