2012-10-04 76 views
2

我有一個Drupal 7網站,我正努力尋找解決以下問題的方法。Drupal 7異常'EntityMalformedException'試圖運行搜索索引cron

我有我所有的cron任務運行良好,但搜索索引cron。它在日誌中產生這個錯誤並停止索引。看起來它與field.multilingual.inc中的entity_extract_ids()函數有關,但我不知道從哪裏開始。這裏是錯誤日誌:

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} 

任何幫助或見解將不勝感激。

回答

6

我會告訴你我是如何解決它。

我EntityMalformedException:缺少對節點類型錯誤的實體包屬性在試圖索引搜索(所以cron運行後)我watchlog(最近的日誌消息)。在我的索引之前讓我們說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,ASC n.nid LIMIT 0,1"
    如果你有表的前綴,不要忘了把它放在這裏。
  4. 因爲你會得到一行與NID,選擇它。
  5. 轉到節點表並在這裏運行「SELECT * FROM node WHERE nid = your-nid」where your-nid is nid from step 3
  6. 嘗試打開你的網站/節點/你的nid - 對我來說我得到了「404錯誤」
  7. 返回到phpMyAdmin和刪除此行
  8. 運行的cron再次

至於我,我這樣做7-8次,以刪除數據庫中的所有「壞」節點,最後得到100%的指數

如果你沒有訪問phpMyAdmin時I g UESS你可以這樣做: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再次

以上代碼我沒有測試它刪除,所以如果你使用它,請張貼在這裏,如果它工作

謝謝你,快樂的索引;)

+2

我試過了,它效果很好!克朗開始繼續並完成搜索索引。感謝您的回答。非常感謝它 – d3vo

+0

很高興它幫助你! – Paradoxetion

0

此錯誤,特別是當被搜索引起的(如Apache Solr實現)有關該疫情週報節點e已編入索引,但不再存在於Drupal中。

這可能時發生:

  • 節點(也條款或用戶)已經從Drupal的刪除,但它仍然在Solr的索引,
  • 的Drupal的多個實例共享相同的Solr的,所以一些節點通過不同的實例進行索引,但它們不是在數據庫中,

該解決方案包括:

  • 清除Solr的索引和緩存,然後重新指數再度節點,
  • 如果故障節點存在 - 再保存它們會有所幫助,
  • 跟蹤哪些節點不能從您的回溯加載和嘗試加載它手動(例如drush ev "var_dump(node_load(12));"),看看它爲什麼失敗。

如果經常發生這種情況,請確保從Drupal中刪除的節點也從Solr索引中刪除。

欲瞭解更多信息,請檢查:How to debug EntityMalformedException? at DA