'solr - gestion de cores y cambio de indices online'

Posted on Sat 30 April 2011 in misc • 2 min read

Hace unos días os hable de Solr, un motor de búsqueda hecho en java basado en Lucene.

Una de las nuevas funcionalidades que han implementado ha sido el soporte para manejar diferentes cores. Los cores en solr son diferentes instancias del buscador que funcionan completamente independientes dentro del contenedor J2EE, con sus propios indices, configuración, etc

Esto nos va a permitir crear, recargar, clonar, renombar y cambiar los cores completamente online, sin interrumpir el servicio en ningun momento

Supongamos que tenemos que hacer una reindexacion completa de los datos de nuestro buscador porque hemos cambiado los campos, pero no queremos dejar de dar servicio.

Para configurar solr para soportar multicore, tenemos que crear en el directorio principal un archivo llamado solr.xml, con el siguiente formato:

<solr persistent="true"> <cores adminPath="/admin/cores"> <core name="core0" instanceDir="core0" /> </cores> </solr>

Es importante persistence=true para permitir al servidor tomcat modificar el propio solr.xml para guardar los cambios que le vamos a ordenar por http.

Ahora iniciamos solr y vemos el status de los cores:

http://localhost:8080/solr/admin/cores

En esta url nos dara los datos en formato xml de todos los cores disponibles asi como informacion del numero de documentos, si esta optimizado el indice, etc.

<response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">1</int> </lst> <lst name="status"> <lst name="core0"> <str name="name">core0</str> <str name="instanceDir">/opt/tomcat/solr/core0/</str> <str name="dataDir">/opt/tomcat/solr/core0/data/</str> <date name="startTime">2011-04-30T00:32:55.975Z</date> <long name="uptime">1082425</long> <lst name="index"> <int name="numDocs">0</int> <int name="maxDoc">0</int> <long name="version">1304123575977</long> <bool name="optimized">false</bool> <bool name="current">true</bool> <bool name="hasDeletions">false</bool> <str name="directory">org.apache.lucene.store.NIOFSDirectory:org.apache.lucene.store.NIOFSDirectory@/opt/tomcat/solr/core0/data/index</str> <date name="lastModified">2011-04-30T00:32:55Z</date> </lst> </lst> </lst>

</response>

Ahora creamos una copia del directorio base de nuestro y decimos a solr que cree un core con el:

root@lnxport:/opt/tomcat/solr# cp -R core0/ coretemp root@lnxport:/opt/tomcat/solr# curl "http://localhost:8080/solr/admin/cores?action=CREATE&name=coretemp&instanceDir=coretemp"

Ahora si vemos el status nuevamente, veremos que tenemos 2 cores, core0 y coretemp, ademas los 2 tienen los mismos datos, por lo que los podemos intercambiar para hacer las modificaciones que queramos en nuestro core principal sin interrumpir el servicio, lo haremos con es siguiente comando:

root@lnxport:/opt/tomcat/solr# curl "http://localhost:8080/solr/admin/cores?action=SWAP&core=core0&other=coretemp"

Si miramos nuevamente el status, veremos que ahora, core0 tiene como datadir el directorio coretemp y nuestros usuarios podran seguir consultando el buscador.

Ahora podemos hacer las modificaciones que queramos sobre coretemp, que esta usando el directorio de nuestro coreo /opt/tomcat/solr/core0/, por ejemplo reindexar, cambiar el schema o las opciones de solrconfig.xml.

Si cambiamos algo del schema o solrconfig deberiamos borrar el directorio data y hacer un CREATE para que regenere los indices.

http://localhost:8080/solr/admin/cores?action=CREATE&name=core0&instanceDir=core0"

Un vez que hayamos reindexado y hecho todos los cambios volvemos a cambiar los cores para dejarlos como estaban

root@lnxport:/opt/tomcat/solr# curl "http://localhost:8080/solr/admin/cores?action=SWAP&core=core0&other=coretemp"

Esta flexibilidad de solr nos permite tener todos los cores que queramos online e ir usándolos según queramos.