Campos custom en SOLR index con Entity API & Search API - Drupal 7

Author Top
enzo

Hoy en día la capacidad de buscar en un sitio web es casi obligatoria y la mayoría de las veces se da por sentado que allí estará.

Usando Drupal tenemos dos opciones principales SOLR y Elastic Search como servidores para indexar nuestra información. Hoy voy a explorar cómo trabajar con SOLR.

De la misma forma existen en Drupal dos módulos populares para conectarse con SOLR, estos módulos son apachesolr y search_api, para este articulo utilizare search_api para interactuar con SOLR.

1. El problema.

Vamos a imaginar este problema: Tenemos un tipo de contenido Evento con un campo de fecha para determinar la fecha de la fecha de inicio y fin (opcional).

Usando Search API este campo podría ser indexado sin problemas, pero si tratamos de hacer una lista de todos los eventos en un rango de fechas es difícil porque el módulo de Views  no proporciona el operador Between para vistas de tipo SOLR, este operador sólo está disponible para vistas utilizando Entity Fields.

2. La solución.

Debido a que todos los eventos tienen una granularidad a nivel de minutos, no podemos usar el operador de Equal para determinar si un evento pertenece a un día específico. Para resolver ese problema debemos añadir información adicional a nuestro indice en SOLR, creando dos nuevos campos para almacenar un campo que almacene el día de inicio del evento y así poder utilizar operator "=".

Para crear estos nuevos campos en nuestras entidades nodo usaremos Entity API  y específicamente el hook hook_entity_property_info_alter().

Déjenme mostrarles un ejemplo de esta implementación.

/**
 * Implements hook_entity_property_info_alter().
 */
function MYMODULE_entity_property_info_alter(&$info) {
  $info['node']['properties']['event_start_day'] = array(
    'type' => 'integer',
    'label' => t('Event Start Day'),
    'sanitized' => TRUE,
    'getter callback' => 'MYMODULE_search_api_property_event_start_day_getter_callback',
  );
  $info['node']['properties']['event_end_day'] = array(
    'type' => 'integer',
    'label' => t('Event End Day'),
    'sanitized' => TRUE,
    'getter callback' => 'MYMODULE_search_search_api_property_event_end_day_getter_callback',
  );
}

Como se puede ver estamos modificando la definición de la entidad Nodo, para incluir dos nuevas propiedades event_start_day y event_end_day, probablemente el valor mas importante en esta declaración es el getter callback que es una función que se utiliza para calcular los valores adecuados para cada propiedad.

Las funciones definidas en getter callback es utilizada por Seach API en el proceso de indexación para almacenar el valor del índice en SOLR.

Déjame mostrarte un ejemplo de aplicación de dichas getter callbacks.

**
 * Getter callback for event start day.
 */
function MYMODULE_search_api_property_event_start_day_getter_callback($item) {
  return strtotime(substr($item->field_event_date[LANGUAGE_NONE][0]['value'], 0, 10)); 
}

/**
 * Getter callback for event end day.
 */
function MYMODULE_search_search_api_property_event_end_day_getter_callback($item) {
  // Set time at midnight of end day of event
  if($item->field_event_date[LANGUAGE_NONE][0]['value2'] != '') {
    return strtotime(substr($item->field_event_date[LANGUAGE_NONE][0]['value2'], 0, 10)) + 86399;
  }
  else {
    return strtotime(substr($item->field_event_date[LANGUAGE_NONE][0]['value'], 0, 10)) + 86399;
  }
}

¡Por supuesto usted puede implementar cualquier lógica necesaria dentro de estas funciones, la varable $item es un objeto que representa un nodo de Drupal.

Después de limpiar su caché los nuevos campos se podrán seleccionar para ser indexados por SOLR, puede hacerlo accediendo a la URL http://example.com/admin/config/search/search_api/index/YOUR_INDEX/fields como se puede ver en la siguiente imagen.

Cuando el proceso de ejecución re-indexe, los nuevos campos se almacenará en SOLR y podrá ser seleccionado en una vista.

Espero que hayas encontrado este post útil.