Drupal 7按相关性排序搜索结果

时间:2012-01-16 10:12:08

标签: search drupal-7

在我的模块中,我有this实现,其中我有一个hook_search_execute()函数,可用于重写/扩展默认的Drupal搜索。此函数调用executeFirstPass()方法,并向查询添加以下$first->addExpression('SUM(i.score * t.count)', 'calculated_score');

当我尝试将我的排序添加为$query->orderBy('calculated_score', 'ASC');后,我出错了。

但是,如果我添加$query->orderBy('n.title', 'ASC');$query->orderBy('n.created', 'ASC');,一切都很好,并按照应有的顺序排序。

有没有人知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

经过我所有的研究,我只得到了这个糟糕的解决方案。

modules/search/search.extender.inc文件中,我们在第437行中有以下代码(取决于Drupal版本)。

....
// Convert scores to an expression.
$this->addExpression('SUM(' . implode(' + ', $this->scores) . ')', 'calculated_score', $this->scoresArguments);

if (count($this->getOrderBy()) == 0) {
  // Add default order after adding the expression.
  $this->orderBy('calculated_score', 'DESC');
}
....

我将此代码转换为:

....
// Convert scores to an expression.
$this->addExpression('SUM(' . implode(' + ', $this->scores) . ')', 'calculated_score', $this->scoresArguments);

if (count($this->getOrderBy()) == 0) {
  if ($_GET['orderby'] == 'relevance' && $_GET['orderdir'] == 'ASC') {
    $dir = 'ASC';
  }
  else {
    $dir = 'DESC';
  }
  // Add default order after adding the expression.
  $this->orderBy('calculated_score', $dir);
}
....

请随意提出清洁解决方案。