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 函数完成,但这就是我迄今为止一直在尝试的所有内容。谢谢!

获取问题和答案的更新

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");

希望这对你有帮助。

  • 拉姆,非常感谢你到目前为止的帮助。第一部分工作得很好,现在我可以看到我的字段已添加到索引中。但是,按照所述使用 addFilter() 函数添加它们不会返回任何内容。关于格式的任何其他想法。我正在编辑我的问题以包括我迄今为止尝试过但没有奏效的所有内容......  2012 年 5 月 9 日 16:38
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");
}
  • 谢谢,拉姆。这正是我一直在做的,除了我的问题中的代码是这些函数的 Drupal 7 版本。它仍然不是 100% 为我工作,但我为你的第一个答案 +1,因为它肯定让我更接近。再次感谢!  2012 年 5 月 15 日 20:12

您的答案

来自  https://stackoverflow.com/questions/10485996/apachesolr-query-filter-by-text-in-fields