Reindexación CKAN/SOLR (workaround)

lunes, 17 de diciembre de 2012 0 comentarios
Una de las mejoras solicitadas dentro de la comunidad de CKAN es la posibilidad de poder llevar a cabo una reindexación no destructiva de indices de Apache SOLR. Actualmente, me encuentro supervisando la implantación de una instancia de CKAN para montar un portal de datos abiertos y durante el proceso hemos tenido que llevar a cabo una clonación de instancias. Durante ese proceso consideramos necesario llevar a cabo una carga de datos directa sobre la base de datos de la nueva instancia de CKAN con los contenidos de la antigua y detectamos que efectivamente SOLR no habia sido capaz de reindexar todos los nuevos contenidos por lo que aparecian falseados en la nueva instancia. Esto quiere decir que por ejemplo en la home de CKAN aparecia el mensaje de que este portal contenia 0 datasets cuando en realidad no era asi:


y adicionalmente, dado que teniamos habilitado la opción de indexación con SOLR en la configuración de CKAN tampoco aparecia ningun resultado al ejecutar una busqueda: 



Pero sin embargo los datos persistian en la base de datos, ya que como podemos ver, cuando accediamos a la zona de grupos, aqui si tenia acceso a los datasets que estaban ya cargados en la plataforma, existiendo un total de 22. 


Para corroborar nuestra teoria, accedimos a la instancia de SOLR que administraba la indexación de contenidos de CKAN y lanzamos la consulta por defecto *:* devolviendonos cero resultados.



Actualmente no existe solución para este problema y lo que he llevado a cabo es el desarrollo de un pequeño workaround para conseguir que SOLR reindexe los contenidos de CKAN. Este se basa en llevar a cabo la recopilación de todos los datasets via API REST de CKAN y llevar a cabo una actualización trivial de los mismos para que vuelva a forzarse la reindexación. Para desarrollarlo he partido del cliente de CKAN en PHP de Jeffrey Barke. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 <?php
 @ini_set('error_reporting', E_ALL);
 @ini_set('display_errors', 'stdout');
 require_once('config.php');
 require_once('ckan-client.php');

 $ckan = new Ckan_client(API);

 try
 {
  $data = $ckan->get_package_register();
  if ($data){
   $backup = array();
   echo 'Step 1: UPDATE';
   for ($i = 0; $i < count($data); $i++){
    $dataset = $ckan->get_package_entity($data[$i]);
    array_push($backup,$dataset->author);
    $cmd = "curl ".URL."/api/rest/dataset/".$dataset->name;
    $cmd = $cmd ." -d '{\"name\":\"".$dataset->name.'",';
    $cmd = $cmd ." \"author\":\"generate-reindex\"}'";
    $cmd = $cmd ." -H \"Authorization:".API.'"';
    echo $cmd;
    $output = system($cmd, $retval);
    echo $retval;
    echo $dataset->name.' reindexed by Solr';
 
   }
   echo 'Step 2: RESTORE';
   for ($i = 0; $i < count($data); $i++){
    $dataset = $ckan->get_package_entity($data[$i]);
    $cmd = "curl ".URL."/api/rest/dataset/".$dataset->name;
    $cmd = $cmd ." -d '{\"name\":\"".$dataset->name.'",';
    $cmd = $cmd ." \"author\":\"".$backup[$i]."\"}'";
    $cmd = $cmd ." -H \"Authorization:".API.'"';
    $output = system($cmd, $retval);
    echo $retval;
    echo $dataset->name.' restored and re-reindexed by Solr';
   }
 
   echo 'SUCCESS';
  }
 }catch (Exception $e)
 {
  print 'Caught exception: ' . $e->getMessage();
 }
 ?>

La ejecución de este script PHP fuerza a una actualización de todos los datasets y permite que SOLR pueda volver a reindexarlos. Una vez reindexados si volvemos a acceder al resultado de la busqueda de nuestra instancia de CKAN y al resultado de la query lanzada a SOLR vemos que estas devuelven los resultados esperados.


Este pequeño pro-tip debe tomarse como un workaround y debe revisarse todo el modelo de datos para comprobar que no se ha perdido ninguna referencia. Adicionalmente antes de llevar a cabo esto, recomiendo realizar un dump completo de la base de datos de CKAN.


Si todo ha ido correctamente deberá aparecer la traza de peticiones de tipo REST dentro del conjunto de historico de peticiones gestionadas por el administrador de la plataforma.

Hope it helps!

Compárteme en: Eskup Facebook Tuenti Meneame Bitacoras Google Yahoo Windows Live