【问题标题】:Removing Solr duplicate values into multivalued field将 Solr 重复值删除到多值字段中
【发布时间】:2012-10-29 15:59:55
【问题描述】:

我的 Solr 索引包含具有重复值的多值字段。如何删除重复项?

索引时是否可以将重复值覆盖到多值字段中?

谢谢

【问题讨论】:

    标签: solr indexing


    【解决方案1】:

    我正在努力实现同样的目标。这对我有用。 将以下处理器添加到您的 solrconfig.xml

    <updateRequestProcessorChain name="deduplicateMultiValued" default="true">
            <processor class="org.apache.solr.update.processor.UniqFieldsUpdateProcessorFactory">
                <lst name="fields">
                    <str>multivaluedFieldXYZ</str>
                </lst>
            </processor>
            <processor class="solr.RunUpdateProcessorFactory" />
     </updateRequestProcessorChain>
    

    【讨论】:

    • 使用当前版本的 Solr,内部 lst/str 行将变成 1 行,如下所示:multivaluedFieldXYZ
    • 请注意,这不适用于 copyFields,但仅在文档被索引时才有效。它将在该点删除所有重复的插入。
    【解决方案2】:

    聚会真的迟到了,但在 Solr 6.0 中,试图在多值字段上添加重复条目的最佳答案对我不起作用。它在UniqFieldsUpdateProcessorFactory 之前缺少一个处理器。所以在我的 solrconfig.xml 中添加这样的东西就可以了:

    <updateRequestProcessorChain name="uniq-fields">
    <processor class="org.apache.solr.update.processor.DistributedUpdateProcessorFactory"/>
    <processor class="org.apache.solr.update.processor.UniqFieldsUpdateProcessorFactory">
      <str name="fieldName">YourFieldA</str>
      <str name="fieldName">yourFieldB</str>
    </processor>
    <processor class="solr.RunUpdateProcessorFactory" />
    

    YourFieldA 和 YourFieldB 是 schema.xml 中定义的字段。请注意,您还必须将其添加到正确的requestHandler 即:

      <requestHandler name="/update" class="solr.UpdateRequestHandler" >
    <lst name="defaults">
      <str name="update.chain">uniq-fields</str>
    </lst>
    

    这不仅可以防止添加重复项,还可以在更新指定字段时从索引中删除所有重复项。

    【讨论】:

      【解决方案3】:

      您需要在客户端处理它以删除重复值。

      您可以自定义实现,如RemoveDuplicatesTokenFilterFactory(适用于相同位置的相同文本)以过滤掉标记。基本上写一个扩展。 或者

      另外,如果只使用多值字段进行分面,则分面字段中的值只计算一次。因此,即使您添加多个相同的值,也会在构面计数条目中反映为单个值。对此进行了测试。你也可以确认。

      但是,重复值会导致 lengthNorm 发生变化,因此会对评分产生影响。

      【讨论】:

        【解决方案4】:

        我使用 solrJ 来绑定文档,为了避免重复值,我将我的多值字段定义为 HashSet。

        @Field("description")
        public Collection<String> description = new HashSet<>();
        

        【讨论】:

          【解决方案5】:

          在最新版本的 solr 中,您可以在对多值字段进行原子更新时使用 add-distinct

          添加区别: 将指定的值添加到 multiValued 字段,仅当不存在时。可以指定为单个值,也可以指定为列表。

          (参考:https://lucene.apache.org/solr/guide/8_8/updating-parts-of-documents.html

          【讨论】:

            【解决方案6】:

            或者您可以在 Solr 中处理它,但在 UpdateRequestProcessor 中处理它,这样它就发生在索引之前,您不需要了解分析链。

            ScriptUpdateProcessor 可以使用 java 或多种脚本语言

            【讨论】:

              【解决方案7】:

              此配置适用于 Solr 5.3.1

              <updateRequestProcessorChain name="distinct-values" default="true">
                  <processor class="solr.DistributedUpdateProcessorFactory"/>
                  <processor class="solr.UniqFieldsUpdateProcessorFactory">
                      <str name="fieldName">field1</str>
                      <str name="fieldName">field2</str>
                  </processor>
                  <processor class="solr.RunUpdateProcessorFactory" />
              </updateRequestProcessorChain>  
              

              【讨论】:

                猜你喜欢
                • 2016-08-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-02-14
                • 1970-01-01
                相关资源
                最近更新 更多