web-dev-qa-db-fra.com

Comment forcer l'API de recherche à réindexer une Node / an Entity

Je travaille sur l'API Sear. Mon entité a de nombreux éléments et modifications de données par action de l'utilisateur. Je ne veux pas réindexer tous les éléments de données. Je veux donc réindexer une entité après que l'utilisateur ait fait l'action. J'ai trouvé le sujet mais juste pour Drupal 7. Donc, avec l'API de recherche pour Drupal 8, comment puis-je implémenter la recherche forcée API pour réindexer une entité? La manière ou le code d'extrait que je peux utiliser? S'il vous plaît, aidez-moi!

par exemple. J'ai un index de recherche avec un champ de base comme celui-ci:

enter image description here

Je veux mettre à jour le nombre de valeur de commentaire après utilisation ajouter un nouveau commentaire. L'API de recherche par défaut ne prend pas en charge cela. Et je ne veux pas attendre qu'un cron mette à jour la valeur. Imaginez un champ très important pas comme le nombre de commentaires. Ce champ doit être mis à jour immédiatement.

8
Jonh

Vous pouvez plonger profondément dans le code de search_api pour trouver une solution au problème. Voir fonction search_api_entity_update () et search_api_search_api_index_update () . En cas de réindexation du nombre de commentaires, vous pouvez essayer ce code:

// Example reindex after has new comment at node article id 1
$entity = Node::load(1);
$indexes = ContentEntity::getIndexesForEntity($entity);

foreach ($indexes as $index) {
    // Becarefull with indexes. Just for this case.
    // $datasource_id: entity:node (entity type)
    // $updated_item_ids: 1:en (node ID and Language)
    $index->trackItemsUpdated('entity:node', ['1:en']);
}

Vous pouvez déboguer dans search_api.module pour plus d'informations.

8
MrD

Comme D7, vous n'avez pas besoin de marquer implicitement l'entité à réindexer par l'API de recherche. Il fait déjà le travail pour vous.

Dans le fichier de module, il y a une implémentation de hook_entity_update () , qui se charge de réindexer les éléments immédiatement. Pas besoin d'attendre la course cron.

J'ai créé un site sur simplytest https://du6hi.ply.st (admin/admin) pour confirmer.

2
AjitS

Comme l'a remarqué @Duncanmoo (D7), il existe divers cas d'utilisation où vous pouvez ré-indexer une page ou une entité vous-même dans du code personnalisé.

Dans mon cas, les mises à jour d'entité de nœud pertinentes ont été implémentées comme ceci:

$node = node_load($nid);
$node->field_search_rank[LANGUAGE_NONE][0]['value'] = $movie->order;
field_attach_presave('node', $node);
field_attach_update('node', $node);
entity_get_controller('node')->resetCache([$node->nid]);

Pourtant, search_api_entity_update () n'a pas été déclenché pour que le champ mis à jour soit réindexé dans Solr, car le hook n'écoute pas field_attach_update ()

Au lieu de cela, j'ai appliqué ce code personnalisé supplémentaire suggéré pour terminer la réindexation sur chaque élément.

$node = node_load($nid);
$node->field_search_rank[LANGUAGE_NONE][0]['value'] = $movie->order;
field_attach_presave('node', $node);
field_attach_update('node', $node);
entity_get_controller('node')->resetCache([$node->nid]);
// Re-index the node updates : 
search_api_track_item_change('node', array($node->nid));
$combined_id = 'node/' . $node->nid;
search_api_track_item_change('multiple', array($combined_id));
0
rawdesk.be