java solr solrj unique-key solr-schema

java - Solr Composite Clave única de campos existentes en el esquema



solrj unique-key (3)

Tengo un índice llamado LocationIndex en solr con los campos de la siguiente manera:

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

Pero ahora quiero cambiar el esquema para que esa clave única debe estar compuesta de dos campos ya presentes, solr_id y solr_ver ... algo de la siguiente manera:

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

Después de buscar, encontré que es posible agregando el siguiente esquema: (ref: Solr Composite clave única de campos existentes en el esquema )

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

Así que cambié el esquema y finalmente se ve así:

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

Pero al agregar un documento me está dando un error:

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

No obtengo los cambios en el esquema necesarios para que funcionen como se desea.

En un documento que agrego, contiene campos solr_ver y solr_id . ¿Cómo y dónde va a (solr) crear un campo de id combinando ambos campos algo así como solr_ver-solr_id ?

EDITAR:

En este enlace se indica cómo se refiere a esta cadena. Bu. No entiendo cómo se usaría en el esquema. ¿Y dónde debería hacer cambios?


Entonces parece que tiene su updateRequestProcessorChain definido apropiadamente y debería funcionar. Sin embargo, debe agregar esto al archivo solrconfig.xml y no a schema.xml. El enlace adicional que proporcionó le muestra cómo modificar su archivo solrconfig.xml y agregar su updateRequestProcessorChain /update controlador de solicitud actual /update para su instancia de solr.

Entonces, haz lo siguiente:

  1. Mueva su <updateRequestProcessorChain> a su archivo solrconfig.xml.
  2. Actualice la entrada <requestHandler name="/update" class="solr.UpdateRequestHandler"> en su archivo solrconfig.xml y modifíquela para que tenga el aspecto siguiente:

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

Esto debería ejecutar su cadena de actualización definida y llenar el campo de Id. Cuando se agregan nuevos documentos al índice.


La solución descrita anteriormente puede tener algunas limitaciones, ¿qué ocurre si "dest" supera la longitud máxima porque los campos concatenados son demasiado largos? También hay una solución más con MD5Signature (Una clase capaz de generar una String de firma a partir de la concatenación de un grupo de campos de documentos especificados, hash de 128 bits utilizado para la detección exacta de duplicados)

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

Desde aquí: http://lucene.472066.n3.nabble.com/Solr-duplicates-detection-td506230.html