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

9

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 nur für Drupal 7 gefunden. Wie kann ich mit der Such-API für Drupal 8 die Force-Such-API implementieren, um eine Entität neu zu indizieren? Wie oder welchen Snippet-Code kann ich verwenden? Bitte helfen Sie!

zB habe ich einen Suchindex mit einem Grundfeld wie diesem:

Geben Sie hier die Bildbeschreibung ein

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.

Jonh
quelle

Antworten:

8

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.

MrD
quelle
2

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.

AjitS
quelle
danke für die Hilfe. Aber ich möchte sofort aktualisieren. Warten Sie nicht, bis Cron neu indiziert ist.
Jonh
@ Jonh Ich habe die Implementierung im Code falsch verstanden. Sie müssen nicht auf den Cron-Lauf warten. Die Elemente werden automatisch neu indiziert. Die Antwort wurde bearbeitet, um sie wiederzugeben.
AjitS
Versuchen Sie es mit du6hi.ply.st/seach und fügen Sie am Knoten / 10 einen neuen Kommentar hinzu.
Jonh
Der Suchindex würde von Kommentaren nicht beeinflusst. Dies liegt daran, dass die Kommentarentität nicht ausgewählt ist, um von der Datenquelle indiziert zu werden. du6hi.ply.st/admin/config/search/search-api/index/default_index/… @Jonh
AjitS
Dies ist nur ein Beispiel, das wir implementieren müssen, wenn eine Aktion ausgeführt wird. Danke für die Zeithilfe.
Jonh
0

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));
rawdesk.be
quelle