web-dev-qa-db-ja.com

Search APIにa Node / Entityを再インデックスするように強制する方法

私はSear APIに取り組んでいます。私のエンティティには多くのアイテムがあり、ユーザーのアクションによってデータが変化します。データのすべてのアイテムのインデックスを再作成したくない。したがって、ユーザーがアクションを実行した後、エンティティのインデックスを再作成したいと思います。私は topic を見つけましたが、Drupal 7.の場合のみです。したがって、Drupal 8の検索APIを使用して、強制検索を実装する方法を教えてください。エンティティのインデックスを再作成するAPI?使用できる方法またはスニペットコード?助けてください!

例えば私はこのようないくつかの基本的なフィールドを持つ検索インデックスを持っています:

enter image description here

使用後にコメント数を更新したいのですが、新規コメントを追加します。デフォルトの検索APIはそれをサポートしていません。そして、cronが値を更新するのを待ちたくありません。コメントの数ではなく、非常に重要な1つのフィールドを想像してください。そのフィールドはすぐに更新する必要があります。

8
Jonh

Search_apiのコードを詳しく調べて、問題の解決策を見つけることができます。関数 search_api_entity_update() および search_api_search_api_index_update() を参照してください。コメント数を再インデックスする場合は、このコードを試すことができます:

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

詳細は、search_api.moduleでデバッグできます。

8
MrD

D7と同じように、検索APIによってインデックスを再作成するエンティティを暗黙的にマークする必要はありません。それはすでにあなたのために仕事をします。

モジュールファイルには、 hook_entity_update() の実装があり、アイテムのインデックスの再作成を即座に行います。 cronの実行を待つ必要はありません。

確認のために、simplytest https://du6hi.ply.st (admin/admin)にサイトを作成しました。

2
AjitS

@Duncanmoo(D7)で述べたように、カスタムコードでページまたはエンティティのインデックスを自分で再作成したい場合があるさまざまなユースケースがあります。

私の場合、関連するノードエンティティの更新は次のように実装されました。

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

それでも、フックはfield_attach_update()をリッスンしないため、search_api_entity_update()はトリガーされず、更新されたフィールドがSolrに再インデックス付けされました。

代わりに、この提案された追加のカスタムコードを適用して、各アイテムの再インデックスを完了しました。

$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