ノードまたはエンティティを再インデックスするように検索APIを強制する方法


9

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

たとえば、次のような基本的なフィールドを持つ検索インデックスがあります。

ここに画像の説明を入力してください

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

回答:


8

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でデバッグできます。


2

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

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

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


手伝ってくれてありがとう。でもすぐ更新したいです。cronがインデックスを再作成するのを待ちません。
Jonh

@ジョン私はコードの実装を誤解しています。cronの実行を待つ必要はありません。アイテムのインデックスが自動的に再作成されます。それを反映するように回答を編集しました。
AjitS 2018年

du6hi.ply.st/seachで試して、node / 10に新しいコメントを追加してください。
Jonh

検索インデックスはコメントの影響を受けません。これは、コメントエンティティがデータソースによってインデックス付けされるように選択されていないためです。du6hi.ply.st/admin/config/search/search-api/index/default_index/... @Jonh
AjitS

使用がアクションを実行するときに実装するコードが必要な例です。時間の助けをありがとう。
Jonh

0

@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));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.