Drupal和Solr添加自定义字段以进行索引

时间:2016-04-05 15:32:29

标签: apache drupal solr drupal-7 drupal-modules

我正在尝试从Drupal环境中向Solr添加自定义字段。

我在schema.xml中的Atm

<field name="custom_files" type="text" indexed="true" stored="true" termVectors="true"/>

在hook_apachesolr_index_documents_alter()中的drupal自定义模块中

foreach($documents as &$document){
    $document->addField('custom_files', 'some long string');

在solr查询和模式浏览器中,'custom_files'字段存在且可以读取,但是,在一般搜索中它不返回任何内容。根据“custom_files”字段进行返回的唯一方法是直接在字段中搜索。

我如何在常规搜索中修改solr搜索'custom_files'字段?

注意:我还尝试使用动态字段定义创建字段,但结果相同。

2 个答案:

答案 0 :(得分:2)

你没有提到哪个版本的Drupal(我假设D7?)或者你正在使用哪个模块(apachesolr或search_api_solr),但要点是你需要将它添加到fl参数(fl =字段列表) )以便在搜索结果中返回该字段的内容。您已将数据编入索引,但您还必须告诉查询返回该数据。使用apacheolr模块,您可以使用hook_apachesolr_query_prepare钩子来添加该参数。

function mymodule_apachesolr_query_prepare() {
  $query->addParam('fl', 'custom_files');
)

另外,为什么在schema.xml中使用自定义字段? Solr具有dynamic fields,允许您即时创建自定义字段,而无需向架构定义添加任何内容。这些文本字段在D7 apachesolr模式中定义:

<dynamicField name="ts_*"  type="text"    indexed="true"  stored="true" multiValued="false" termVectors="true"/>
<dynamicField name="tm_*"  type="text"    indexed="true"  stored="true" multiValued="true" termVectors="true"/>

s和m代表'single'和'multiple',所以如果字段只存储每个文档的单个值,则使用ts_,如果字段每个文档有多个值,则使用tm_。

因此,在您的情况下,您可以在索引钩子中执行此操作:

$document->addField('ts_custom_files', 'some long string');

然后

$query->addParam('fl', 'ts_custom_files');
在您的query_prepare钩子中

。而这一切都没有在您的架构中添加任何内容。

答案 1 :(得分:0)

如果你正在使用 search_api_solr (D7),这里是如何添加节点中未包含的额外信息(例如计算值)。

在.module中,使用类似:

的内容
function mymodule_alter_callback_info() {
    $callbacks['index_metadata'] = array(
        'name' => t('Index node metadata'),
        'description' => t('Add node metadata to solr index.'),
        'class' => 'IndexMetadata'
    );
}

IndexMetadata类类似于:

// IndexMetadata.inc
class IndexMetadata extends SearchApiAbstractAlterCallback {
  public function alterItems(array &$items) {
    foreach ($items as $id => &$item) {
      $item->indexed_at = time(); // or other more useful metadata
    }
  }
  public function propertyInfo() {
    return array(
      'indexed_at' => array(
        'label' => t('Index timestamp'),
        'description' => t('Unixtime when node was indexed'),
        'type' => 'int'
      ),
    );
  }
}

在模块的.info文件中,添加:

files[] = IndexMetadata.inc

包括上述课程。

最后,运行drush cc all,然后转到Search API配置页面,找到要添加的索引并单击“过滤器”(或admin / config / search / search_api / index / [index_name] / workflow )。将显示新处理器的“索引时间戳”。勾选该框以使其在索引上运行。