11

LocationIndex次のようなフィールドを持つsolrで名前が付けられたインデックスがあります。

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

しかし今、私はスキーマを変更して、一意のキーが2つの既存のフィールドの複合体でなければならないようにしたいと思っていますsolr_id...solr_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) はsolr_ver-solr_id?

編集:

このリンクでは、このチェーンを参照する方法が示されています。しかし、スキーマでどのように使用されるのか理解できませんか? また、どこを変更すればよいですか?

4

3 に答える 3

10

したがって、 updateRequestProcessorChain が適切に定義されているようで、動作するはずです。ただし、これを schema.xml ではなく、solrconfig.xml ファイルに追加する必要があります。あなたが提供した追加のリンクは、solrconfig.xml ファイルを変更し、定義した updateRequestProcessorChain を/updatesolr インスタンスの現在の要求ハンドラーに追加する方法を示しています。

したがって、次のことを見つけてください。

  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>
    

これにより、定義済みの更新チェーンが実行され、新しいドキュメントがインデックスに追加されたときに id フィールドが入力されます。

于 2013-07-23T15:40:09.580 に答える
4

連結されたフィールドが長すぎるために「dest」が最大長を超えている場合、上記のソリューションにはいくつかの制限がある場合があります。MD5Signature (指定されたドキュメント フィールドのグループの連結から署名文字列を生成できるクラス、正確な重複検出に使用される 128 ビット ハッシュ) を使用したもう 1 つのソリューションもあります。

<!-- 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 に答える