从动态字段中存储了一个包含多个值的字段,该数据在输入 xml 文件中以正确的顺序出现,但是当我们进行搜索时,数据以完全不同的顺序出现。有没有办法控制这个顺序?
让我描述一下这个过程。
1-输入文件带有动态字段,遵循模式*_foo
。
2- solr 从添加的动态字段中获取值并将该值复制到 allFoos
。
3-我们搜索多值字段,并分析其内容。
我们看到存储在 allFoos
中的值丢失了输入文件给出的顺序。
此虚拟数据提供了有关我们如何处理字段和副本的示例。 然后更改字段名称和值以进行测试,但结果预计是相同的。
架构
<dynamicField name="`*_foo`" type="string" indexed="false" stored="true"/>
<field name="`allFoos`" type="string" indexed="true" stored="true" required="false" multiValued="true"/>
<copyField source="`*_foo`" dest="`allFoos`"/>
输入文件
<add>
<doc>
<field name="field_1_foo" update="set">1</field>
<field name="field_2_foo" update="set">2</field>
<field name="field_3_foo" update="set">3</field>
<field name="field_4_foo" update="set">4</field>
<field name="field_5_foo" update="set">5</field>
<field name="field_6_foo" update="set">6</field>
<field name="field_7_foo" update="set">7</field>
<field name="field_8_foo" update="set">8</field>
<field name="field_9_foo" update="set">9</field>
<field name="field_10_foo" update="set">10</field>
<field name="field_11_foo" update="set">11</field>
<field name="field_12_foo" update="set">12</field>
<field name="field_13_foo" update="set">13</field>
<field name="field_14_foo" update="set">17</field>
<field name="field_15_foo" update="set">15</field>
<field name="field_16_foo" update="set">16</field>
<field name="field_17_foo" update="set">17</field>
<field name="field_18_foo" update="set">18</field>
<field name="field_19_foo" update="set">19</field>
<field name="field_20_foo" update="set">20</field>
<field name="field_21_foo" update="set">21</field>
<field name="field_22_foo" update="set">21</field>
<field name="field_23_foo" update="set">21</field>
<field name="field_24_foo" update="set">21</field>
<field name="field_25_foo" update="set">21</field>
</doc>
</add>
结果
"allFoos": [ "3", "16", "25", "20", "19", "7", "21", "6", "13", "8", "5", "18", "24", "17", "23", "15", "4", "10", "12", "11", "2", "14", "22", "9", "1"]
每次搜索结果都是一样的,我已经多次删除并重新插入相同的数据,并且总是按照相同的顺序。
感谢您的帮助!
最佳答案
Yonik Seely 在 this thread 的末尾很好地总结了这一点:
Order is guaranteed to be maintained for values in a multi-valued field. Order of different fields is not maintained.
既然您要将 25 个不同字段复制到 allFoos
中,订单无法保证。 SolrInputDocument
由 LinkedHashMap
支持默认情况下,但也有一个接受任意 Map<String,SolrInputField>
的构造函数,这意味着不应依赖文档中字段的顺序。
public SolrInputDocument() {
_fields = new LinkedHashMap<>();
}
public SolrInputDocument(Map<String,SolrInputField> fields) {
_fields = fields;
}
作为文档摄取过程的一部分,您可以预处理数据以生成单个字段,并以正确的顺序将值添加到该字段。应保持单个字段内的顺序。这最好在外部管道中完成,您可以在其中观察源文档中的原始顺序。也许如果某些排序或其他逻辑可以根据字段名称重建正确的顺序,您可以通过安装自定义 UpdateRequestProcessorFactory
在 Solr 中完成此操作。执行。
关于Solr 多值字段中值的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27176215/