Как вывести сначала точное совпадение, а затем частичное совпадение после поиска - PullRequest
0 голосов
/ 06 мая 2020

У меня есть следующий запрос, который дает результаты после поиска в поле поиска. Он работает нормально, за исключением того, что сначала не будет возвращать более конкретные c результаты. Например, если я ищу «Learn Laravel», сначала будут показаны результаты, включая только «обучение» и только «laravel», а затем результат, содержащий и то, и другое. Я пытаюсь позволить запросу сначала получить точный результат, а затем результаты, содержащие одно из двух слов.

$searchValues2 = preg_split('/\s+/', $query, -1, PREG_SPLIT_NO_EMPTY); 
                  $posts = DB::table('gl as g')  
                    ->join('subcat as a', 'a.id', '=' , 'g.subcat')
                    ->join('steps as s', 's.goal_id','=', 'g.id')
                    ->join('users as u', 'g.user_id', '=' , 'u.id')
                    ->join('country as c', 'c.id', '=' , 'g.country')

                     ->where(function ($q2) use ($searchValues2) {
                      foreach ($searchValues2 as $value2) {
                        $q2->orWhere(DB::raw("g.title"), 'LIKE', "%{$value2}%");
                        $q2->orWhere(DB::raw("s.step"), 'LIKE', "%{$value2}%");
                      }
                    })

                    ->where('g.draft_flag', '!=', 1) 
                 ->orderby('g.created_at', 'desc') 
                 ->take(40)
                 ->groupby('g.id')
                 ->select('g.title as title', 'a.subcat as categ', 'g.id as id', 'u.id as u_id', 
                 'u.first_name as f_name', 'u.last_name as l_name', 'a.subcat as subcat','g.tlike as 
                  tlike','u.avatar as avatar','c.country as country')
                  ->get();

1 Ответ

0 голосов
/ 06 мая 2020

Вы не можете сделать это с синтаксисом LIKE. Есть некоторые уловки, которые можно использовать для оценки синтаксиса LIKE, но в вашем случае я думаю, что они не сработают. Вы можете попытаться отсортировать коллекцию после в зависимости от количества совпадений, но лучше будет использовать ПОЛНЫЙ ТЕКСТОВЫЙ ПОИСК.

Сначала вы должны добавить индекс полнотекстового поиска.

ALTER TABLE gl ADD FULLTEXT title_fulltext (title)

Затем: -> select (['....', DB :: raw ('MATCH (title) AGAINST (\' '. $ query.' \ ')')]) -> whereRaw ('MATCH (title) AGAINST ( ?) ', массив ($ запрос))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...