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"/>
s
和 m
代表 single
和 multiple
,因此如果该字段每个只存储一个值,您将使用 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'。勾选方框使其 运行 出现在索引中。
我正在尝试从 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"/>
s
和 m
代表 single
和 multiple
,因此如果该字段每个只存储一个值,您将使用 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'。勾选方框使其 运行 出现在索引中。