instalar - solr tutorial
Cómo actualizar los documentos Solr en el lado del servidor Solr con controlador/complemento personalizado (2)
No estoy seguro de si lo siguiente mejorará el rendimiento, pero pensé que podría ser útil.
Mire SolrEntityProcessor
Su descripción suena muy relevante para lo que estás buscando.
This EntityProcessor imports data from different Solr instances and cores.
The data is retrieved based on a specified (filter) query.
This EntityProcessor is useful in cases you want to copy your Solr index
and slightly want to modify the data in the target index.
In some cases Solr might be the only place were all data is available.
Sin embargo, no pude encontrar una característica lista para insertar su lógica. Por lo tanto, es posible que deba extender la siguiente clase.
SolrEntityProcessor y el enlace al código fuente
Probablemente lo sepas, pero un par de otros puntos.
1) Hacer que todo el proceso aproveche todos los núcleos de CPU disponibles. Hazlo multihilo.
2) Utiliza la última versión de Solr.
3) Experimenta con dos aplicaciones de Solr en diferentes máquinas con un retraso de red mínimo. Esta sería una decisión difícil:
same machine, two processes VS two machines, more cores, but network overhead.
4) Tweak Solr cache de una manera que se aplica a su caso de uso y la implementación particular.
5) Un par de recursos más: Solr Performance Problems y SolrPerformanceFactors
Espero eso ayude. Déjame saber las estadísticas a pesar de esta respuesta. Tengo curiosidad y tu información podría ayudar a alguien más tarde.
Tengo un núcleo con millones de registros.
Quiero agregar un controlador personalizado que escanee los documentos existentes y actualice uno de los campos en función de una condición (edad> 12, por ejemplo).
Prefiero hacerlo en el lado del servidor Solr para evitar enviar millones de documentos al cliente y volver.
Estaba pensando en escribir un complemento de solr que recibirá una consulta y actualizará algunos campos en los documentos de consulta (como el método de eliminación por consulta).
Me preguntaba si hay soluciones existentes o mejores alternativas.
Estuve buscando en la web por un tiempo y no pude encontrar ejemplos de complementos de Solr que actualicen documentos (no necesito extender el controlador de actualizaciones).
Escribí un complemento que usa el siguiente código que funciona bien, pero no tan rápido como lo necesito.
Actualmente lo hago:
AddUpdateCommand addUpdateCommand = new AddUpdateCommand(solrQueryRequest);
DocIterator iterator = docList.iterator();
SolrIndexSearcher indexReader = solrQueryRequest.getSearcher();
while (iterator.hasNext()) {
Document document = indexReader.doc(iterator.nextDoc());
SolrInputDocument solrInputDocument = new SolrInputDocument();
addUpdateCommand.clear();
addUpdateCommand.solrDoc = solrInputDocument;
addUpdateCommand.solrDoc.setField("id", document.get("id"));
addUpdateCommand.solrDoc.setField("my_updated_field", new_value);
updateRequestProcessor.processAdd(addUpdateCommand);
}
Pero esto es muy caro, ya que el controlador de actualización recuperará nuevamente el documento que ya tengo a mano.
¿Existe alguna manera segura de actualizar el documento de lucene y escribirlo de nuevo teniendo en cuenta todo el código relacionado con Solr, como cachés, lógica de sol adicional, etc.?
Estaba pensando en convertirlo en SolrInputDocument y luego simplemente agregar el documento a través de Solr, pero primero necesito convertir todos los campos.
Gracias de antemano, Avner
Para señalar dónde colocar la lógica personalizada, sugeriría echar un vistazo a SolrEntityProcessor junto con Solr''s ScriptTransformer .
ScriptTransformer permite calcular cada entidad después de extraerla de la fuente de una importación de datos, manipularla y agregar valores de campo personalizados antes de escribir la nueva entidad en solr.
Un ejemplo de data-config.xml podría verse así
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<script>
<![CDATA[
function calculateValue(row) {
row.put("CALCULATED_FIELD", "The age is: " + row.get("age"));
return row;
}
]]>
</script>
<document>
<entity name="sep" processor="SolrEntityProcessor"
url="http://localhost:8080/solr/your-core-name"
query="*:*"
wt="javabin"
transformer="script:calculateValue">
<field column="ID" name="id" />
<field column="AGE" name="age" />
<field column="CALCULATED_FIELD" name="update_field" />
</entity>
</document>
</dataConfig>
Como puede ver, puede realizar cualquier transformación de datos que desee y es expresable en javascript. Entonces este sería un buen punto para expresar su lógica y transformaciones.
Usted dice que una restricción puede ser age > 12
. Lo manejaría a través del atributo de query
de SolrEntityProcessor. Puede escribir query=age:[* TO 12]
para que solo se lean los registros con una edad de hasta 12 para la actualización.