Solr Composite来自模式中现有字段的唯一键

时间:2013-07-23 09:49:17

标签: java solr solrj unique-key solr-schema

我在solr中有一个名为LocationIndex的索引,其字段如下:

<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>

搜索后我发现可以通过在架构中添加以下内容:(ref: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_ver-solr_id字段的方式和位置(

修改

this link给出了如何引用这个链。我无法理解如何在架构中使用它?我应该在哪里进行更改?

3 个答案:

答案 0 :(得分:10)

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

所以请执行以下操作:

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

    <requestHandler name="/update" class="solr.UpdateRequestHandler">
       <lst name="defaults">
          <str name="update.chain">composite-id</str>
       </lst>
    </requestHandler>
    
  3. 然后执行定义的更新链并在将新文档添加到索引时填充id字段。

答案 1 :(得分:4)

上述解决方案可能会有一些限制,如果&#34; dest&#34;超过最大长度,因为连接字段太长。 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

答案 2 :(得分:2)

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