11

我有一个以LocationIndexsolr 命名的索引,其字段如下:

<fields>
    <field name="solr_id" type="string" stored="true" required="true" indexed="true"/>
    <field name="solr_ver" type="string" stored="true" required="true" indexed="true" default="0000"/>
    // and some more fields
</fields>
<uniqueKey>solr_id</uniqueKey>

但是现在我想更改架构,以便唯一键必须由两个已经存在的字段solr_idsolr_ver......如下所示:

<fields>
    <field name="solr_id" type="string" stored="true" required="true" indexed="true"/>
    <field name="solr_ver" type="string" stored="true" required="true" indexed="true" default="0000"/>
    <field name="composite-id" type="string" stored="true" required="true" indexed="true"/>
    // and some more fields
</fields>
<uniqueKey>solr_ver-solr_id</uniqueKey>

搜索后,我发现可以通过将以下内容添加到架构中:(参考:Solr Composite Unique key from existing fields in schema

<updateRequestProcessorChain name="composite-id">
  <processor class="solr.CloneFieldUpdateProcessorFactory">
    <str name="source">docid_s</str>
    <str name="source">userid_s</str>
    <str name="dest">id</str>
  </processor>
  <processor class="solr.ConcatFieldUpdateProcessorFactory">
    <str name="fieldName">id</str>
    <str name="delimiter">--</str>
  </processor>
  <processor class="solr.LogUpdateProcessorFactory" />
  <processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>

所以我改变了架构,最后它看起来像:

<updateRequestProcessorChain name="composite-id">
  <processor class="solr.CloneFieldUpdateProcessorFactory">
    <str name="source">solr_ver</str>
    <str name="source">solr_id</str>
    <str name="dest">id</str>
  </processor>
  <processor class="solr.ConcatFieldUpdateProcessorFactory">
    <str name="fieldName">id</str>
    <str name="delimiter">-</str>
  </processor>
  <processor class="solr.LogUpdateProcessorFactory" />
  <processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>

<fields>
    <field name="solr_id" type="string" stored="true" required="true" indexed="true"/>
    <field name="solr_ver" type="string" stored="true" required="true" indexed="true" default="0000"/>
    <field name="id" type="string" stored="true" required="true" indexed="true"/>
    // and some more fields
</fields>
<uniqueKey>id</uniqueKey>

但是在添加文档时它给了我错误:

org.apache.solr.client.solrj.SolrServerException: Server at http://localhost:8983/solr/LocationIndex returned non ok status:400, message:Document [null] missing required field: id

我没有得到按要求工作所需的架构更改?

在我添加的文档中,它包含字段solr_versolr_id. id通过将这两个字段组合起来,它将如何以及在何处(solr)创建字段solr_ver-solr_id

编辑:

这个链接它给出了如何引用这个链。但我无法理解它如何在模式中使用?我应该在哪里进行更改?

4

3 回答 3

10

所以看起来你已经适当地定义了你的 updateRequestProcessorChain 并且它应该可以工作。但是,您需要将其添加到 solrconfig.xml 文件而不是 schema.xml。您提供的附加链接向您展示了如何修改您的 solrconfig.xml 文件并将您定义的 updateRequestProcessorChain 添加到/update您的 solr 实例的当前请求处理程序中。

所以找到执行以下操作:

  1. 将您的移动<updateRequestProcessorChain>到您的 solrconfig.xml 文件。
  2. 更新<requestHandler name="/update" class="solr.UpdateRequestHandler">solrconfig.xml 文件中的条目并对其进行修改,使其如下所示:

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

然后,这应该执行您定义的更新链并在将新文档添加到索引时填充 id 字段。

于 2013-07-23T15:40:09.580 回答
4

上述解决方案可能有一些限制,如果“dest”超过最大长度,因为连接字段太长怎么办。MD5Signature 还有一个解决方案(能够从一组指定文档字段的连接中生成签名字符串的类,128 位哈希用于精确的重复检测)

<!-- An example dedup update processor that creates the "id" field on the fly 
     based on the hash code of some other fields.  This example has 
     overwriteDupes set to false since we are using the id field as the 
     signatureField and Solr will maintain uniqueness based on that anyway. --> 
<updateRequestProcessorChain name="dedupe"> 
  <processor class="org.apache.solr.update.processor.SignatureUpdateProcessorFactory"> 
    <bool name="enabled">true</bool> 
    <bool name="overwriteDupes">false</bool> 
    <str name="signatureField">id</str> 
    <str name="fields">name,features,cat</str> 
    <str name="signatureClass">org.apache.solr.update.processor.Lookup3Signature</str> 
  </processor> 
  <processor class="solr.LogUpdateProcessorFactory" /> 
  <processor class="solr.RunUpdateProcessorFactory" /> 
</updateRequestProcessorChain> 

从这里: http: //lucene.472066.n3.nabble.com/Solr-duplicates-detection-td506230.html

于 2014-06-16T18:30:38.987 回答
2

我想将此作为评论添加,但这些天不可能获得信誉......无论如何,这是一个更好的链接: https ://wiki.apache.org/solr/Deduplication

于 2014-07-04T17:19:30.927 回答