使用任何顺序或组合的单词进行搜索并返回行

时间:2017-07-25 15:16:40

标签: laravel laravel-5

我的表格有一行存储为D1234 HEX SCREW GS0090 O109。目前我可以执行类似D1234 HEXSCREW GS0090的操作,它将返回该行。但是,我希望能够以任意组合或任何顺序输入单词,例如D1234 GS0090HEX D1234,并让它返回此行。如何才能做到这一点?

编辑:我正在使用Laravel 5.4,一个使用MyISAM引擎的mysql数据库

$products = DB::connection('it')
            ->table('it')
            ->join('units','units.code', '=', 's.code')
            ->join('vendors', 'vendors.code', '=', 's.code')
            ->where('s.deleted', '=', 0)
            ->where('vendors.deleted', '=', 0)
            ->where('s.description', 'LIKE', '%'.$term.'%')
            ->orWhere('s.vendorcode', 'LIKE', '%'.$term.'%' )
            ->orWhere('s.vendordefaultcode','LIKE', '%'.$term.'%')
            ->orWhere('vendors.partnumber', 'LIKE', '%'.$term.'%')
            ->orWhere('vendors.partvendorcode', 'LIKE', '%'.$term.'%')
            ->get());

1 个答案:

答案 0 :(得分:0)

如果您使用的是mysql,我建议使用全文搜索。它主要用于高级搜索,但它可以很好地增强您的搜索。

首先,您需要为要使用全文搜索的每列添加fulltext索引:

ALTER TABLE tablename ADD FULLTEXT(description);

接下来修改您的查询:

$products = DB::connection('it')
            ->table('it')
            ->join('units','units.code', '=', 's.code')
            ->join('vendors', 'vendors.code', '=', 's.code')
            ->where('s.deleted', '=', 0)
            ->where('vendors.deleted', '=', 0)
            ->whereRaw("MATCH (s.description) AGAINST ('{$term}*' IN BOOLEAN MODE)")
            ->orWhereRaw("MATCH (s.vendorcode) AGAINST ('{$term}*' IN BOOLEAN MODE)")
            ->orWhereRaw("MATCH (s.vendordefaultcode) AGAINST ('{$term}*' IN BOOLEAN MODE)")
            ->orWhereRaw("MATCH (vendors.partnumber) AGAINST ('{$term}*' IN BOOLEAN MODE)")
            ->orWhereRaw("MATCH (vendors.partvendorcode) AGAINST ('{$term}*' IN BOOLEAN MODE)")
            ->get());

一些帮助

的链接

MySQL Full-Text Search with Multiple words

mySQL Full Text Search With Percentage Scoring