drupal-header

Setear y recuperar fields de Apache Solr en Drupal (y PHP en general)

Voy a partir de la premisa de que ya tenemos un apache solr corriendo y un drupal con el modulo configurado.

Dicho lo anterior, se nos plantea la siguiente pregunta: ¿Cómo hago para tomar un dato relacionado a un nodo, se lo paso a solr para que lo indexe como un field en el documento de solr y luego lo recupero junto a los documentos/resultados de una búsqueda?

Aunque parezca mentira, es mas bien fácil de hacer, pero si les pasa como a mi, seguramente gasten una horita en conseguir este dato, porque no es un tema extensamente documentado Solr + Drupal.

1) Agregar un dato X a un field de un documento:

Para este primer paso apelamos al hook hook_apachesolr_update_index(). ¿que hace?, nos da la oportunidad de agregar o quitar información al documento que se esta por enviar a solr, y ya puestos, nos manda el nodo del cual se extrajo la información para sacar de ahi (o de cualquier otro lado) información extra. (esto nos evita tener que hacer un node_load() ).

Arriba no hay mucho que aclarar, básicamente por medio del método addField() seteo un par de  nuevos field (is_apellido_creador y is_edad_creador) asignandoles un valor que anteriormente habre recogido de algun lugar.

NOTA: Mucha atención al prefijo que usé en los nombres de los field (“is_“). No lo hice por que si, sino porque en el schema.xml los creadores del modulo de drupal han predefinido una serie de prefijos para las filas dinámicas como las que estamos creando. Dicho de otra forma, si no usamos uno de los prefijos definidos en schema.xml, los field no se van a indexar.

2) Pedir un field a Solr:

Solr puede tener en un documento cualquier cantidad de fields almacenados en su interior, lo que no quiere decir que en cada resultado de una busqueda se vayan a incluir todos estos field… imaginarán que la performance no se basa justamente en la premisa de “mandame todo lo que tengas que ya veré yo que es lo que me hace falta“. Mas bien hay que decirle a Solr en la consulta, que es lo que necesitas recibir de un documento de la siguiente manera:

Como pueden ver, lo que hago aquí es sumarle a “fl” dos campos más. “fl” es justamente la clave que almacena todos los field que le vamos a pedir a Solr.

Listo, ya podemos setear y recuperar fields. Solo queda que modifiques la pagina de resultados para poder imprimir cada uno de los nuevos field que recibiste, pero esa es otra historia.

Concepto original extraído de:
http://www.agileapproach.com/blog-entry/filtering-apache-solr-search-results-based-drupal-user-permissions

2 Comments

  • roosvelt 11/11/2010

    Saludos a todos…mi pregunta es como puedo hacer para indexar campos de cck en apache solr…creo un campo con solr y quiero indexarlo en Apache solr..cual seria la mejor manera? Mil Gracias

    • Capy 13/11/2010

      Segun la documentacion del modulo:

      hook_apachesolr_cck_fields_alter(&$mappings)

      Add or alter index mappings for CCK types. The default mappings array handles just
      text fields with option widgets:

      $mappings[‘text’] = array(
      ‘optionwidgets_select’ => array(‘callback’ => ”, ‘index_type’ => ‘string’),
      ‘optionwidgets_buttons’ => array(‘callback’ => ”, ‘index_type’ => ‘string’)
      );

      In your _alter hook implementation you can add additional field types such as:

      $mappings[‘number_integer’][‘number’] = array(‘callback’ => ”, ‘index_type’ => ‘integer’);

      You can allso add a mapping for a specific field. This will take precedence over any
      mapping for a general field type. A field-specific mapping would look like:

      $mappings[‘per-field’][‘field_model_name’] = array(‘callback’ => ”, ‘index_type’ => ‘string’);

      or

      $mappings[‘per-field’][‘field_model_price’] = array(‘callback’ => ”, ‘index_type’ => ‘float’);

:).