我正在尝试从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'字段?
注意:我还尝试使用动态字段定义创建字段,但结果相同。
答案 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 )。将显示新处理器的“索引时间戳”。勾选该框以使其在索引上运行。