it-swarm.com.de

So erzwingen Sie, dass die Such-API eine Node / eine Entität) neu indiziert

Ich arbeite an der Sear API. In meiner Entität ändern sich viele Elemente und Daten durch die Aktion des Benutzers. Ich möchte nicht alle Daten neu indizieren. Daher möchte ich eine Entität neu indizieren, nachdem der Benutzer die Aktion ausgeführt hat. Ich habe das Thema gefunden, aber nur für Drupal 7. Also mit der Such-API für Drupal 8, wie ich die Suche erzwingen kann API zum Neuindizieren einer Entität? Die Art und Weise oder der Snippet-Code, den ich verwenden kann? Bitte helfen Sie!

z.B. Ich habe einen Suchindex mit einem Grundfeld wie diesem:

(enter image description here

Ich möchte die Anzahl der Kommentarwerte nach der Verwendung aktualisieren und einen neuen Kommentar hinzufügen. Die Standardsuch-API unterstützt das nicht. Und ich möchte nicht darauf warten, dass ein Cron den Wert aktualisiert. Stellen Sie sich ein Feld vor, das nicht so wichtig ist wie die Anzahl der Kommentare. Dieses Feld muss sofort aktualisiert werden.

8
Jonh

Sie können tief in den Code von search_api eintauchen, um eine Lösung für das Problem zu finden. Siehe Funktion search_api_entity_update () und search_api_search_api_index_update () . Falls Sie die Anzahl der Kommentare neu indizieren, können Sie diesen Code ausprobieren:

// 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']);
}

Sie können in search_api.module debuggen, um weitere Informationen zu erhalten.

8
MrD

Wie bei D7 müssen Sie die Entität, die von der Such-API neu indiziert werden soll, nicht implizit markieren. Es erledigt bereits die Arbeit für Sie.

In der Moduldatei gibt es eine Implementierung von hook_entity_update () , die dafür sorgt, dass die Elemente sofort neu indiziert werden. Es ist nicht erforderlich, auf den Cron-Lauf zu warten.

Ich habe eine Website auf simplytest https://du6hi.ply.st (admin/admin) erstellt, um dies zu bestätigen.

2
AjitS

Wie von @Duncanmoo (D7) bemerkt, gibt es verschiedene Anwendungsfälle, in denen Sie eine Seite oder Entität möglicherweise selbst in benutzerdefiniertem Code neu indizieren möchten.

In meinem Fall wurden die relevanten Knotenentitätsaktualisierungen wie folgt implementiert:

$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]);

Search_api_entity_update () wurde jedoch nicht ausgelöst, um das aktualisierte Feld erneut auf Solr zu indizieren, da der Hook field_attach_update () nicht abhört.

Stattdessen habe ich diesen vorgeschlagenen zusätzlichen benutzerdefinierten Code angewendet, um die Neuindizierung für jedes Element abzuschließen.

$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