Solr 多值字段中值的顺序

标签 solr

从动态字段中存储了一个包含多个值的字段,该数据在输入 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 中,订单无法保证。 SolrInputDocumentLinkedHashMap 支持默认情况下,但也有一个接受任意 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/

相关文章:

Solr:特定自动完成的多个建议器

java - 在 Solr 中索引约 1TB 富文本文档的最佳方法是什么?

search - Solr 匹配整个字段

mysql - Solr 与 MySQL 的索引结构

java - ambari-infra-solr rpm不可用

java - 用于 SDL Tridion 2011 的 Java 部署程序扩展的原型(prototype)或方法,用于将内容索引到 Apache Solr

solr - 如何在 SOLR 中实现复杂的 token 匹配算法

php - Solr 命令不返回 json 输出

php - 我们如何监控 SOLR 数据获取速度?

java - 如何在 Lucene 中索引多边形数据