2

我有一个 Drupal 7 站点,我正在努力寻找解决以下问题的方法。

我的所有 cron 任务都运行良好,但搜索索引 cron。它在日志中产生此错误并停止索引。看起来它与entity_extract_ids()field.multilingual.inc 中的函数有关,但我不知道从哪里开始。这是错误日志:

exception 'EntityMalformedException' with message 'Missing bundle property on entity of type node.' in /home/xxxxx/public_html/includes/common.inc:7562 
Stack trace: 
#0 /home/xxxxx/public_html/modules/field/field.multilingual.inc(268): entity_extract_ids('node', Object(stdClass)) 
#1 /home/xxxxx/public_html/modules/field/field.attach.inc(1111): field_language('node', Object(stdClass), NULL, 'en')
#2 /home/xxxxx/public_html/modules/node/node.module(1358): field_attach_prepare_view('node', Array, 'search_index', 'en') 
#3 /home/xxxxx/public_html/modules/node/node.module(1284): node_build_content(false, 'search_index', 'en') 
#4 /home/xxxxx/public_html/modules/node/node.module(2668): node_view(false, 'search_index') 
#5 /home/xxxxx/public_html/modules/node/node.module(2650): _node_index_node(Object(stdClass)) 
#6 [internal function]: node_update_index() 
#7 /home/xxxxx/public_html/includes/module.inc(826): call_user_func_array('node_update_ind...', Array) 
#8 /home/xxxxx/public_html/modules/search/search.module(363): module_invoke('node', 'update_index') 
#9 [internal function]: search_cron()
#10 /home/xxxxx/public_html/sites/all/modules/ultimate_cron/ultimate_cron.module(726): call_user_func('search_cron') 
#11 [internal function]: _ultimate_cron_run_hook('search_cron', Array)
#12 /home/xxxxx/public_html/sites/all/modules/background_process/background_process.module(428): call_user_func_array('_ultimate_cron_...', Array)
#13 [internal function]: background_process_service_start('ultimate_cron%3...') 
#14 /home/xxxxx/public_html/includes/menu.inc(516): call_user_func_array('background_proc...', Array) #15 /home/xxxxx/public_html/index.php(21): menu_execute_active_handler() 
#16 {main}

任何帮助或见解将不胜感激。

4

2 回答 2

6

我会告诉你我是如何修复它的。

在尝试索引搜索后(因此在 cron 运行之后),我在监视日志(最近的日志消息)中收到 EntityMalformedException: Missing bundle property on entity of type node 错误。在我的指数是 48% 之前,在 cron 运行之后它保持不变。

我做了很多事情,其他建议对我没有帮助,但最后我这样做并建议你:

  1. 备份你的数据库!!!
  2. 转到 phpMyAdmin,到“运行 sql”部分。
  3. 放在这里 "SELECT n.nid FROM node n LEFT JOIN search_dataset d ON d.type = 'node' AND d.sid = n.nid WHERE d.sid IS NULL OR d.reindex <> 0 ORDER BY d.reindex ASC, n.nid ASC LIMIT 0,1"
    如果你有表前缀,别忘了把它放在这里。
  4. 结果,您将获得一排带有nid的信息,请记住。
  5. 转到节点表并在此处运行“SELECT * FROM node WHERE nid=your-nid”,其中 your-nid 是步骤 3 中的 nid
  6. 尝试打开 your-website/node/your-nid - 对我来说,我收到“404 错误”
  7. 返回 phpMyAdmin 并删除此行
  8. 再次运行 cron

就我而言,我这样做了 7-8 次以从数据库中删除所有“坏”节点并最终获得 100% 索引

如果您无权访问 phpMyAdmin,我想您可以这样做:

打开PHP过滤模块和备份数据库创建节点类型的页面例如,正文添加代码

<?php
$result = db_query_range("SELECT n.nid FROM {node} n LEFT JOIN {search_dataset} d ON d.type = 'node' AND d.sid = n.nid WHERE d.sid IS NULL OR d.reindex <> 0 ORDER BY d.reindex ASC, n.nid ASC", 0, 1);
echo $result;
?>

当然选择“PHP过滤器”

单击“预览”您应该会在屏幕上看到节点 ID。像在 phpMyAdmin 说明的第 6 步中一样对其进行测试并记住现在您可以通过添加到正文来删除它

<?php 
$nid = "your-nid";
db_delete('node')
  ->condition('nid', $nid)
  ->execute();
?>

再次单击预览再次运行 Cron

上面的代码我没有测试,所以如果你会使用它,如果它有效,请在此处发布

谢谢你,快乐索引;)

于 2012-11-18T23:57:54.927 回答
0

此错误,尤其是由搜索(例如 Apache Solr)引起的错误与已编入索引的节点有关,但在 Drupal 中不再存在。

这可能发生在以下情况:

  • 节点(也包括术语或用户)已从 Drupal 中删除,但仍在 Solr 中建立索引,
  • Drupal 的多个实例共享同一个 Solr,因此某些节点由不同的实例索引,但它们不在数据库中,

解决方案包括:

  • 清除 Solr 索引和缓存,然后再次重新索引节点,
  • 如果存在故障节点 - 重新保存它们会有所帮助,
  • 从你的回溯追踪哪个节点加载失败并尝试手动加载它(例如drush ev "var_dump(node_load(12));")以查看它失败的原因。

如果这种情况经常发生,请确保从 Drupal 中删除的节点也从 Solr 索引中删除。

有关更多信息,请查看:如何调试 EntityMalformedException?在 DA

于 2016-02-10T20:13:55.350 回答