Drupal 和 Solr 添加用于索引的自定义字段

Drupal and Solr add custom field for indexing

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

schema.xml 的自动取款机我有

<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' 字段存在并且可以读取,但是,在一般搜索中它 return 什么都没有。根据 'custom_files' 字段对 return 做一些事情的唯一方法是直接在字段中搜索。

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

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

您没有提到哪个版本的 Drupal(我假设是 D7?)或您使用的是哪个模块(apachesolr 或 search_api_solr),但要点是您需要将它添加到 fl 参数(fl = 字段列表),以便字段的内容在搜索结果中 returned。您已经为数据编制了索引,但您还必须告诉查询 return 该数据。对于 apachesolr 模块,您可以使用 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"/>

sm 代表 singlemultiple,因此如果该字段每个只存储一个值,您将使用 ts_文档,并且 tm_ 如果该字段在每个文档中有多个值。

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

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

然后

$query->addParam('fl', 'ts_custom_files');

在您的 query_prepare 钩子中。所有这一切都没有向您的模式添加任何内容。

如果您正在使用 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 class 类似于:

// 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

包括以上class.

最后,运行 drush cc all 然后转到搜索 API 配置页面,找到您要添加到的索引并单击 'Filters'(或 admin/config/search/search_api/index/[index_name]/工作流程)。显示了新处理器 'Index timestamp'。勾选方框使其 运行 出现在索引中。