Я не эксперт по полному текстовому поиску, поэтому я немного погуглил SQL-запрос Сортировка по релевантности и придумал это, что несколько работает:
SELECT *, MATCH(fulltext_tags) AGAINST ('+blue' '+red') AS relevance FROM `products` WHERE MATCH(fulltext_tags) AGAINST ('+blue' '+red' IN BOOLEAN MODE) ORDER BY relevance DESC
Проблема в том, что учитывается только первое ключевое слово.
Скажи, у меня есть эта таблица продуктов
+----------+------------------+
| name | fulltext_tags |
+----------+------------------+
| Product1 | Blue |
| Product2 | Red |
| Product3 | Blue Red |
| Product4 | Yellow |
+----------+------------------+
Приведенный выше запрос возвращает только продукты 1 и 3, он полностью игнорирует второе ключевое слово + красный. Даже добавление + Желтый в качестве третьего ключевого слова все равно игнорирует его, поэтому он игнорирует все, что находится за первым ключевым словом …
Как сделать так, чтобы запрос с + синим и + красным возвращал Product1 Product2 и Product3, так как в поле fulltext_tags фигурирует хотя бы одно или оба ключевых слова?
Спасибо
Вы должны использовать REGEXP '[[:<:]]Red[[:>:]]'
Чтобы найти точное слово, попробуйте запрос ниже, надеюсь, он будет работать и выполнить ваше требование.
SELECT * FROM `products`
WHERE fulltext_tags REGEXP '[[:<:]]Red[[:>:]]'
OR fulltext_tags REGEXP '[[:<:]]Blue[[:>:]]';
Ты можешь видеть ДЕМО здесь.
Обновление 1
Попробуйте этот запрос, как я вижу, вы хотите сделать что-то вроде этого,
SELECT *,
MATCH(fulltext_tags) AGAINST ('+blue' '+red')
AS relevance FROM `products`
WHERE MATCH(fulltext_tags) AGAINST('Red')
OR MATCH(fulltext_tags) AGAINST('Blue')
ORDER BY relevance DESC
Посмотреть здесь ОНЛАЙН ДЕМО
Других решений пока нет …