如何在 Drupal 7 搜索 API 模块中将内容实体标记为脏
How do I mark content entities as dirty in Drupal 7 Search API module
我正在使用 Drupal 7 进行搜索 api。我知道搜索 api 的 'common pitfalls' 之一是“相关实体的变化不会导致 re-indexing”。我在搜索 api 索引中引入了一个名为 'Collection Reference' 的字段作为 'type = content' 。因此,当 collection 的标题发生变化时,搜索 API 并没有意识到它发生了变化。
我曾尝试使用所讨论的规则模块对其进行排序 - https://www.drupal.org/docs/7/modules/search-api/getting-started/common-pitfalls#indirect-changes - 但我无法使其正常工作。有人对这种技术有好运吗?
我解决了这个问题。
在我的例子中,我在索引中有照片,它们有一个画廊作为实体字段,如果在照片索引中修改了画廊,则画廊不会更新。因此,使用 SQL 抓取了与该画廊相关的所有照片,然后将其放入一个肮脏的 ids 数组中。所以下面的代码:
function hook_entity_presave($entity, $type) {
if ($entity->type == 'MYCONTENTTYPE') {
if ($entity->original->title !== $entity->title) {
$dirty_ids = array();
$nid = $entity->nid;
$result = db_query('SELECT g.entity_id FROM {gallery} g WHERE c.id = :nid', array(':nid' => $nid));
foreach($result as $record) {
$dirty_ids[] = $record->entity_id;
}
if(!empty($dirty_ids)) {
search_api_track_item_change('node', $dirty_ids);
}
}
}
}
我正在使用 Drupal 7 进行搜索 api。我知道搜索 api 的 'common pitfalls' 之一是“相关实体的变化不会导致 re-indexing”。我在搜索 api 索引中引入了一个名为 'Collection Reference' 的字段作为 'type = content' 。因此,当 collection 的标题发生变化时,搜索 API 并没有意识到它发生了变化。 我曾尝试使用所讨论的规则模块对其进行排序 - https://www.drupal.org/docs/7/modules/search-api/getting-started/common-pitfalls#indirect-changes - 但我无法使其正常工作。有人对这种技术有好运吗?
我解决了这个问题。
在我的例子中,我在索引中有照片,它们有一个画廊作为实体字段,如果在照片索引中修改了画廊,则画廊不会更新。因此,使用 SQL 抓取了与该画廊相关的所有照片,然后将其放入一个肮脏的 ids 数组中。所以下面的代码:
function hook_entity_presave($entity, $type) {
if ($entity->type == 'MYCONTENTTYPE') {
if ($entity->original->title !== $entity->title) {
$dirty_ids = array();
$nid = $entity->nid;
$result = db_query('SELECT g.entity_id FROM {gallery} g WHERE c.id = :nid', array(':nid' => $nid));
foreach($result as $record) {
$dirty_ids[] = $record->entity_id;
}
if(!empty($dirty_ids)) {
search_api_track_item_change('node', $dirty_ids);
}
}
}
}