web-dev-qa-db-fra.com

Comment faire une mise à jour de l'entité personnalisée ou créer une mise à jour automatiquement de l'indice SOLR?

J'ai mis en place un type d'entité personnalisé qui est essentiellement identique à ce que module modèle fait, avec quelques champs supplémentaires.

J'ai suivi le module utilisateur ApacheSolr pour comprendre comment indexer mes entités personnalisées dans l'index SOLR. Mais lorsque j'ajoute ou à la mise à jour et à la mise à jour et à l'entité existante, l'indice SOLR ne ramasse pas automatiquement les modifications.

/**
 * Implements hook_apacheolr_entity_info_alter().
 */
function my_entity_apachesolr_entity_info_alter(&$entity_info) {
  $entity_info['my_entity']['indexable'] = TRUE;
  $entity_info['my_entity']['status callback'][] = 'my_entity_status_callback';
  $entity_info['my_entity']['document callback'][] = 'my_entity_solr_document';
  $entity_info['my_entity']['reindex callback'] = 'my_entity_solr_reindex';
  $entity_info['my_entity']['index_table'] = 'apachesolr_index_entities_my_entity';

  $entity_info['my_entity']['result callback'] = 'my_entity_result';
}

C'est le crochet que j'ai dû mettre en œuvre pour indexer mon contenu, les divers rappels ne sont pas pertinents. Il convient de noter que la table d'index doit également être mise en œuvre dans Hook_Schema (). Cela peut être facilement vu dans l'utilisateur ApacheSolr

3
masterchief

À l'origine, je pensais avoir dû mettre en œuvre mes propres crochets, mais après avoir vu que Apacheesolr a pris soin de Suppletes, je me demandais pourquoi il n'avait pas pris soin de mes mises à jour et de mes insertions.

Il y a en fait un apachesolr_entity_update/insert () qui appelle ApacheSolr_entity_should_index (). Qui vérifie si vos informations d'entité (retournées par entity_get_info ($ entity_type) disposent de la clé suivante:

$info['bundles'][$bundle]['apachesolr']['index']

Où $ Bundle est le paquet d'entité $. Cela m'a rendu assez facile pour moi de comprendre que je devais juste ajouter des choses à mon hook_enttity_info_alter ():

function my_entity_entity_info_alter(&$entity_info) {
  foreach (my_entity_get_types() as $type => $info) {
    $entity_info['my_entity']['bundles'][$type] = array(
      'apachesolr' => array('index' => TRUE),
    );
  }
}

Après avoir ajouté cela et effacer le cache, je n'avais plus besoin de ma mise à jour de mon entité/insérer des crochets.

Remarque: Ne vous confondez pas avec Hook_Apachesolr_entity_info_alter comme je l'ai fait!

Réponse d'origine

J'ai trouvé la fonction ApacheSolr_index_get_entities_to_index () qui vérifie la table de l'indexeur de votre entité_type pour un horodatage modifié plus grand que ce qu'il est vu pour la dernière fois (je n'ai pas encore de savoir où il). Nous avons essentiellement besoin d'automatiser la mise à jour de cette table. Cela peut être fait avec 2 crochets:

harok_enttity_insert ()Hook_entity_update ()

/**
 * Implements hook_entity_insert().
 */
function my_entity_entity_insert($entity, $type) {
  // Update our indexer table
  if ($type != 'my_entity') {
    return;
  }
  $indexer_table = apachesolr_get_indexer_table($type);

 // Insert the new entity into a fictional table of all entities.
  $info = entity_get_info($type);
  list($id) = entity_extract_ids($type, $entity);
  db_insert($indexer_table)->fields(array(
    'entity_type' => $type,
    'bundle' => $entity->type,
    'entity_id' => $id,
    'changed' => REQUEST_TIME,
  ))->execute();
}

/**
 * Implements hook_entity_update().
 */
function my_entity_entity_update($entity, $type) {
  // Update our indexer table
  if ($type != 'my_entity') {
    return;
  }
  $indexer_table = apachesolr_get_indexer_table($type);

  db_update($indexer_table)
    ->fields(array(
      'changed' => REQUEST_TIME,
    ))
  ->condition('entity_id', $entity->entity_id)
  ->execute();
}

Vous devrez peut-être ajouter cette ligne dans l'instruction insertion dans harok_entity_insert () si vous avez un statut provenant d'une entité $ (la mine est toujours 1 afin que la table de base de données par défaut.

'status' => $entity->status,

Edit: Vous vous demandez peut-être "Qu'en est-t-il de la suppression ??", cela semble être pris en charge par ApacheSolr_entity_Delete, je vais voir pourquoi Apachedesolr_entity_update et Apacheesolr_entity_insert n'a pas pris soin de mes entités. Cependant, cette réponse est toujours valide.

4
masterchief