将Solr重复值删除到多值字段中

时间:2012-11-09 10:26:42

标签: solr indexing

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

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

由于

7 个答案:

答案 0 :(得分:4)

我正在努力实现同样的目标。这对我有用。 将以下处理器添加到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>

答案 1 :(得分:4)

派对真的很晚,但是在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 ie:

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

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

答案 2 :(得分:1)

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

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

此外,如果仅使用多值字段进行分面,则分面字段中的值仅计算一次。因此,即使添加多个相同的值,也会将其反映为构面计数条目中的单个值。测试了这个。你也可以证实。

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

此配置适用于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>  

答案 6 :(得分:0)

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

<块引用>

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

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