Mysql поисковая группа или конкретное слово в строке - PullRequest
0 голосов
/ 04 июня 2019

У меня есть продукты.Клиенты хотят, чтобы когда название продукта было похоже на «Защитное стекло для Lenovo Vibe C2», а пользователь ищет «Защитное стекло для стекла c2», чтобы показать продукт.Я создаю запрос с похожим условием, но он работает со словами типа «защитник стекла» или «vibe c2», только с последовательными словами ...

Вот запрос:

$query = Product::find()->joinWith('translation')->joinWith('cats')->joinWith('cats.page')->joinWith('cats.page.parent')->where($whereString);
$whereString .= " AND ( 
                        (
                            product_cat.page_id = '" . $_GET['product_cat'] . "' 
                            OR 
                            parent.id = '" . $_GET['product_cat'] . "' 
                            ) 
                            AND 
                            (
                                page_title LIKE '%" . $_GET['search'] . "%' 
                                OR
                                short_description LIKE '%" . $_GET['search'] . "%'  
                                OR 
                                key_words LIKE '%" . $_GET['search'] . "%'      
                                )
                            )";

Название продукта: «Стеклянный протектор для Lenovo Vibe C2»

Пользователь ищет «Стеклянный протектор» => все в порядке, продукт показан.

НО, когда пользователь ищет «Glass protector C2» => ничего не отображается ... Нет этого продукта в базе данных.

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

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

SELECT * FROM some_table
WHERE page_title REGEXP CONCAT('.*', REPLACE('Glass protector C2', ' ', '.*'), '.*')

Таким образом, это необходимо сделать для всех 3 столбцов икурс с жестко закодированной строкой поиска, замененной переменной, используемой в очереди

0 голосов
/ 04 июня 2019

Вам, вероятно, следует использовать полнотекстовый поиск для достижения этой цели, поскольку оператор like не создан для запросов, которые вы пытаетесь выполнить.

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

ALTER TABLE Product
ADD FULLTEXT(page_title, short_description,…)

Как только индекс создан, вы можете запросить его с помощью полнотекстового поиска, в вашем примере правильным выбором будет использование логического полнотекстового поиска.
Вы можете сделать это так -

SELECT * FROM Product WHERE MATCH (page_title, short_description)
    AGAINST ('+vibe +c2' IN BOOLEAN MODE);

Вы можете посмотреть документацию для получения дополнительной справки - https://dev.mysql.com/doc/refman/8.0/en/fulltext-boolean.html

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