0

我正在以编程方式在我的 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 视图模块验证了搜索索引已经填充了该字段并且可以看到子字符串存在。

我的语法或构建查询的方式有什么问题吗?

如果您知道如何添加过滤器以在某些字段中搜索文本,请分享!它甚至可能无法使用 addFilter 函数完成,但这就是我迄今为止所尝试的全部。谢谢!

4

2 回答 2

3

首先,您必须为该特定字段创建索引。

function hook_apachesolr_update_index(&$document, $node) {
  $document->ss_your_field_name = $node->your_field_name;
}

其中 ss_* 是模式。
ss_* -> 字符串is_*
-> 整数
im_* -> 整数,多值

之后,您必须
1. 删除索引 - admin/settings/apachesolr/index
2. 重新索引内容
3. 运行 cron
4. 检查您创建的过滤器 - admin/reports/apachesolr/index

然后,您可以添加过滤器

$query->addFilter("ss_your_field_name", "value");

希望这对您有所帮助。

于 2012-05-08T07:11:01.317 回答
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");
}
于 2012-05-15T07:36:41.133 回答