Laravel 4 Laravel 4(雄辩的ORM/查询生成器)如何根据大多数匹配项对关键字搜索进行排序

Laravel 4 Laravel 4(雄辩的ORM/查询生成器)如何根据大多数匹配项对关键字搜索进行排序,laravel-4,eloquent,query-builder,keyword-search,Laravel 4,Eloquent,Query Builder,Keyword Search,我在Laravel 4中实现了以下关键字搜索: // Search by keyword(s) if(Input::get('keyword')) { $search = Input::get('keyword'); $searchTerms = explode(' ', $search); $fields = array( 'resources.name', 'resources.description', 'r

我在Laravel 4中实现了以下关键字搜索:

// Search by keyword(s)
if(Input::get('keyword'))
    {
    $search = Input::get('keyword');
    $searchTerms = explode(' ', $search);

    $fields = array(
        'resources.name',
        'resources.description',
        'resources.website',
        'resources.additional_info');

    $query->where(function($query) use ($searchTerms, $fields) {
        foreach ($searchTerms as $term)
        {
            foreach ($fields as $field)
            {
                $query->orWhere($field, 'LIKE', '%'. $term .'%');
            }
        }
    });
}
问题是:
假设我的表中有两个资源,一个名为
foo
,一个名为
bar
,另一个名为
foo bar
。它们被创建并按顺序放入我的表中。现在,如果我搜索“foo-bar”,我得到的前两个结果将是
foo
bar
(因为它们在我的表中第一个匹配foo或bar),第三个结果将是
foo-bar
。如何进行此搜索,使其根据匹配的关键字数对结果进行排序?因此
foobar
将是第一个结果。

您应该使用搜索来实现这一点。您没有指定使用哪个数据库引擎,因此我将给出一个MySQL示例

首先,需要对要搜索的字段启用全文索引

ALTER TABLE resources ADD FULLTEXT search (name,description,website,additional_info);
然后,您需要在查询中得到如下结果:

SELECT
    *, MATCH(name,description,website,additional_info) AGAINST(SEARCH_TERMS) AS score
WHERE
    MATCH(name,description,website,additional_info) AGAINST(SEARCH_TERMS)
我会在Laravel查询生成器中使用类似以下内容(未经测试):

根据您的搜索,您可能需要布尔模式下的
,也可能不需要,或者您可能需要指定不同的模式。有关详细信息,请参阅MySQL手册


注意:大多数关系数据库引擎并不擅长搜索;这不是他们最初设计的目的。如果您发现您的搜索需求比这个简单的示例更加复杂,那么您应该考虑运行一个搜索服务器,如Lucene、Sphinx、Elasticsearch或Solr


(有关更多信息,请参阅和)

我最终使用以下解决方案进行搜索:

if(Input::get('keyword')) {
    $search = Input::get('keyword');
    $query->whereRaw("MATCH(resources.name, resources.description, resources.website, resources.additional_info) AGAINST(? IN BOOLEAN MODE)", 
        array($search)
    );
}
我通过阅读以下几页找到了这个解决方案:

我升级到MySQL 5.6,以便可以向InnoDB表中添加全文索引。我必须按照我在
whereRaw
语句中指定的顺序,将全文索引添加到我想要运行
MATCH
的所有字段中

if(Input::get('keyword')) {
    $search = Input::get('keyword');
    $query->whereRaw("MATCH(resources.name, resources.description, resources.website, resources.additional_info) AGAINST(? IN BOOLEAN MODE)", 
        array($search)
    );
}