Revision of 令 Solr 將 filefield 和 textarea 的資料都放到 index 6.x-1.x from Mon, 2011-11-28 18:02

Drupal apachesolr 的原設定是不會 將 textarea 的文字作為 index 的一部份傳到 solr 的
只會將 body 和 teaser 傳到 solr
原因是 textarea 的 fulltext search 需要 index 的機會很少

但也做成另一個問題, 就是返回 search result 的時候
如果顯示結果需要其中一個 textarea
便會需要一個 node_load()

同樣的情況也出現在 filefield
我的 search result 需要顯示圖片
但我不想每一次都 node_load 一下

而額外增加 index 的語法在 README.txt 也有清楚說明

hook_apachesolr_cck_fields_alter(&$mappings)

  Add or alter index mappings for CCK types.  The default mappings array handles just
  text fields with option widgets:
  為 cck 類增加或修改 index mapping. 預設只對使用 options 的 text 有 mapping:

    $mappings['text'] = array(
      'optionwidgets_select' => array('callback' => '', 'index_type' => 'string'),
      'optionwidgets_buttons' => array('callback' => '', 'index_type' => 'string')
    );

  In your _alter hook implementation you can add additional field types such as:
  你可以曾加自定的 field type:
    $mappings['number_integer']['number'] = array('callback' => '', 'index_type' => 'integer');

  You can also add a mapping for a specific field.  This will take precedence over any
  mapping for a general field type. A field-specific mapping would look like:
  也可以對特定的 field 做 mapping:
    $mappings['per-field']['field_model_name'] = array('callback' => '', 'index_type' => 'string');

  or

    $mappings['per-field']['field_model_price'] = array('callback' => '', 'index_type' => 'float');

我便只對特定的 field (一個 textarea 和 imagefield) 加 mapping:

<?php
/**
 * Drupal default do not index images and textarea, add them to index too for search result display
 **/
function ge_search_apachesolr_cck_fields_alter(&$mappings)
{
 
$mappings['per-field']['field_main_image'] = array(
   
'index_type' => 'string',
   
'callback' => 'ge_search_apachesolr_field_main_image_callback'
 
);
 
$mappings['per-field']['field_specialities'] = array(
   
'index_type' => 'string',
   
'callback' => 'ge_search_apachesolr_field_specialities_callback'
 
);
}

function
ge_search_apachesolr_field_main_image_callback($node, $fieldname)
{
 
$fields = array();
  foreach(
$node->$fieldname as $field) {
   
$fields[] = array('value' => $field['filepath']);
  }
  return
$fields;
}

function
ge_search_apachesolr_field_specialities_callback($node, $fieldname)
{
 
$fields = array();
  foreach(
$node->$fieldname as $field) {
   
$fields[] = array('value' => $field['value']);
  }
  return
$fields;
}
?>

留意我是將 imagefield 的 filepath 傳到 solr
原因是返回的 search result 只需要 filepath 便夠了,
也可以方便使用 theme('imagecache') 之類進行輸出圖片

ref: http://www.acquia.com/blog/understanding-apachesolr-cck-api

Google