我正在以编程方式在我的Drupal模块中构建一个apachesolr查询,并且已经在某些方面取得了成功,但我仍然在与其他方面进行斗争。
到目前为止,我已经能够构建一个可以搜索特定文本的查询,并根据要过滤的术语限制结果,并使用以下代码:
$subquery_region->addFilter('tid', $term->tid);
$query->addFilterSubQuery($subquery_region, 'OR', 'AND');
我接下来想要实现的是通过添加过滤器来查找节点中特定字段内的特定文本,从而进一步缩小搜索范围。有没有人能够做到这一点。
我一直在网上研究并尝试了很多不同的方法,例如直接在主搜索查询中添加过滤器
$query->addParam('fl', 'ss_my_field');
$query->addFilter("ss_my_field", "field_substring_to_search_for");
除了将其分解为子查询以添加到主搜索查询
之外$subquery_test = apachesolr_drupal_query("Test");
$subquery_test->addParam('fl', 'ss_my_field');
$subquery_test->addFilter("ss_my_field", "field_substring_to_search_for");
$query->addFilterSubQuery($subquery_test, 'OR', 'AND');
但这些都不起作用。它们返回一个空集,即使我知道子字符串存在于我添加为过滤器的字段中并且已被索引。我已经通过apachesorl views模块验证了搜索索引已经填充了该字段,并且可以看到子字符串存在。
我的语法或构建查询的方式有什么问题吗?
如果您知道如何在某些字段中添加用于搜索文字的过滤器,请分享!甚至可能无法使用addFilter函数完成,但这是我到目前为止所做的一切。 谢谢!
答案 0 :(得分:3)
首先,您必须为该特定字段创建索引。
function hook_apachesolr_update_index(&$document, $node) {
$document->ss_your_field_name = $node->your_field_name;
}
其中ss_ *是模式。
ss_ * - >字符串
是_ * - >整数
im_ * - >整数,多值
之后你必须要
1.删除索引 - admin / settings / apachesolr / index
2.重新索引内容
3.运行cron
4.检查您创建的过滤器 - admin / reports / apachesolr / index
然后,您可以添加过滤器
$query->addFilter("ss_your_field_name", "value");
希望这会对你有所帮助。
答案 1 :(得分:0)
function hook_apachesolr_modify_query(&$query, &$params, $caller){
$subquery = apachesolr_drupal_query();
$subquery->add_filter("ss_my_field", "field_substring_to_search_for");
$query->add_subquery($subquery, "AND");
}