【问题标题】:Laravel 4 and full-text searchLaravel 4 和全文搜索
【发布时间】:2013-11-26 07:20:27
【问题描述】:

我在 Laravel 中看到很多关于全文搜索的文章,其中用户推荐使用 whereRaw(...) 或 DB::query(...),但我的目标是保持与数据库无关。我知道 where('col', 'like', '%foo%') 很糟糕。性能。

所以我相信我只剩下创建自己的数据库索引了。有什么我可以使用 Laravel 开箱即用的东西,或者我可以设置一些表结构来构建更快的搜索机制吗?

目前,我有一个“主”表,其中包含一个文本列“数据”,我计划在其上运行搜索。这是我要查找的唯一列。

【问题讨论】:

标签: php sql search laravel


【解决方案1】:

如果查询不是问题,我就是这样做的。

首先,在您的视图中包含搜索表单:

{{ Form::open(['method' => 'get']) }}
{{ Form::text('q',Input::get('q')) }}
{{ Form::submit('Search') }}
{{ Form::close() }}

确保您要搜索的表是 MyISAM,您可以通过将其添加到迁移中来做到这一点:

$table->engine = 'MYISAM';

之后,将此范围添加到您的模型并更改您要搜索的列:

public function scopeSearch($query,$q) {
  return empty($q) ? $query : $query->whereRaw(
    "MATCH(title,contents,anotherfield) 
      AGAINST(? IN BOOLEAN MODE)",[$q]);
}

在您的控制器中,只需在获取数据时添加范围:

$posts = Posts::search(Input::get('q'))->get();

它应该可以工作。如果您需要添加分页,请执行以下操作:

$posts = Posts::search(Input::get('q'))->paginate(30);

要在视图中显示链接,请使用以下代码:

{{ $posts->appends(Input::except('page'))->links() }}

这将在分页时保留所有 GET 参数(包括查询参数)。

【讨论】:

    【解决方案2】:

    这是我使用 laravel 进行简单全文搜索的函数。 如果你使用mysql,记得在table上设置引擎为MyISAM。

    我在模型文件中有这个函数,所以我可以调用 User::serachFilter('query');来自控制器。

    public static function searchFilter($data, $pageLimit = '5')
        {
            $keyword = !is_array($data) ? array('+'.$data.'*') : $data;
            $matchArray = array('firstName', 'lastName', 'location', 'address');
            $columns = array();
            foreach($matchArray as $column)
            {
                $columns[] = $column;
            }
            $match = implode(',', $columns);
            $result =  self::whereRaw('MATCH('.$match.') AGAINST (? IN BOOLEAN MODE)', $keyword)
                        ->paginate($pageLimit);
    
            return $result;
        }
    

    编辑: 既然不想用 whereRaw,那就测试一下

        $query = Input::get('search');
        $pageLimit = Input::get('page_limit');
    
        $search = DB::select("
            select *
            from users
            where match(id, name, email, username)
            against('+{$query}*' IN BOOLEAN MODE)
            limit {$pageLimit}
        ");
    
        return $search;
    

    【讨论】:

    • 感谢您的回答,但是,我想避免使用 whereRaw,因为它并没有真正基于底层数据库引擎构建查询。
    【解决方案3】:

    这已从 Laravel 4 中删除,但正如我在另一个问题中已经说过的,它可以很容易地重新实现,如下所述:http://creative-punch.net/implementing-laravel-4-full-text-search/

    虽然 FULLTEXT 索引并非在任何地方都有效

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 2014-11-02
      • 1970-01-01
      • 2018-11-23
      • 2012-02-29
      • 1970-01-01
      • 2019-06-01
      • 2021-10-24
      • 2014-11-28
      相关资源
      最近更新 更多