расширенный поиск по запросу laravel - PullRequest
0 голосов
/ 10 мая 2018

На моем веб-сайте мне нужно предоставить опцию поиска, где пользователь может искать другой продукт. Теперь я хочу, чтобы поисковый ключ совпадал с продуктом, отображал его и вместе с отображением содержал некоторое предложение с этим ключевым словом поиска, разделенным пробелом.

list($type,$search) = explode(":", $key);
$searchValues = preg_split('/\s+/', $search, -1, PREG_SPLIT_NO_EMPTY);

ProductDetail::join('product_brands','product_details.brand_id','product_brands.id')
              ->select('brand_name as manufacturer','product_availability as isInStock','product_details.*','product_price as displayPrice')
              ->where(function ($q) use ($searchValues,$search) {
                    $q->where('product_name', 'like', "%{$search}%");
                    foreach ($searchValues as $value) {
                      $q->orWhere('product_name', 'like', "%{$value}%");
                    }
                })->paginate(5);

Теперь проблема с этим результатом заключается в том, что он не отображается в соответствии с наилучшим / первым соответствием . поэтому пользователь не может найти то, что он ищет, в списке других предложений.

Так, как получить лучший подобранный заказ?

Просмотреть демо-версию

1 Ответ

0 голосов
/ 10 мая 2018

Вам нужен какой-то взвешенный поиск. Если вы посмотрите на этот пакет, вы увидите несколько примеров запросов MySQL, которые он генерирует: https://github.com/nicolaslopezj/searchable

Прокрутите до раздела «результат», в котором будут показаны полученные запросы Это поможет вам оценить ваши результаты на лучший матч. Вы также можете просмотреть Laravel Scout , если у вас есть более глубокие потребности поиска.

Это пример запроса, на который я ссылался, где этот пакет использовался для поиска пользователей, например Sed neque labore:

select `users`.*, 

-- If third parameter is set as true, it will check if the column starts with the search
-- if then it adds relevance * 30
-- this ensures that relevant results will be at top
(case when first_name LIKE 'Sed neque labore%' then 300 else 0 end) + 

-- For each column you specify makes 3 "ifs" containing 
-- each word of the search input and adds relevace to 
-- the row

-- The first checks if the column is equal to the word,
-- if then it adds relevance * 15
(case when first_name LIKE 'Sed' || first_name LIKE 'neque' || first_name LIKE 'labore' then 150 else 0 end) + 

-- The second checks if the column starts with the word,
-- if then it adds relevance * 5
(case when first_name LIKE 'Sed%' || first_name LIKE 'neque%' || first_name LIKE 'labore%' then 50 else 0 end) + 

-- The third checks if the column contains the word, 
-- if then it adds relevance * 1
(case when first_name LIKE '%Sed%' || first_name LIKE '%neque%' || first_name LIKE '%labore%' then 10 else 0 end) + 

-- Repeats with each column
(case when last_name LIKE 'Sed' || last_name LIKE 'neque' || last_name LIKE 'labore' then 150 else 0 end) + 
(case when last_name LIKE 'Sed%' || last_name LIKE 'neque%' || last_name LIKE 'labore%' then 50 else 0 end) +
(case when last_name LIKE '%Sed%' || last_name LIKE '%neque%' || last_name LIKE '%labore%' then 10 else 0 end) + 

(case when bio LIKE 'Sed' || bio LIKE 'neque' || bio LIKE 'labore' then 30 else 0 end) + 
(case when bio LIKE 'Sed%' || bio LIKE 'neque%' || bio LIKE 'labore%' then 10 else 0 end) + 
(case when bio LIKE '%Sed%' || bio LIKE '%neque%' || bio LIKE '%labore%' then 2 else 0 end) + 

(case when email LIKE 'Sed' || email LIKE 'neque' || email LIKE 'labore' then 75 else 0 end) + 
(case when email LIKE 'Sed%' || email LIKE 'neque%' || email LIKE 'labore%' then 25 else 0 end) + 
(case when email LIKE '%Sed%' || email LIKE '%neque%' || email LIKE '%labore%' then 5 else 0 end) 

as relevance 
from `users` 
group by `id` 

-- Selects only the rows that have more than
-- the sum of all attributes relevances and divided by 4
-- Ej: (20 + 5 + 2) / 4 = 6.75
having relevance > 6.75 

-- Orders the results by relevance
order by `relevance` desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...