Задать вопрос
@karpo518

Как в MySQL наcтроить полный аналог LIKE с помощью MATCH AGAINST?

Задача: Cложный запрос поиска по неизвестному количеству слов во всех возможных последовательностях на базе LIKE заменить на аналогичный функционал на базе MATCH AGAINST

Пример запроса:
SELECT * FROM `table` 
WHERE `column1` 
LIKE '%word1%word2%' OR `column1` LIKE '%word2%word1%'


Не стал делать более длинный пример, но думаю, что идея ясна. При бОльшем количестве слов ситуация осложняется.

Я создал таблицу InnoDB в MySQL 5.7.29 с полнотекстовым индексом по полю column1 и начал экспериментировать. В итоге я пришёл к следующему варианту:

SELECT *
FROM `table`
WHERE MATCH (value) AGAINST ('+*word1* +*word2*' IN BOOLEAN MODE)


Запрос находит комбинацию слов в любом порядке, и это прекрасно. Но! Если использовать вместо слова '+*word1*' слово '+*ord1*' то значения со словом word1 запрос уже не извлекает.

Предполагаю, что это связано с тем, чт mysql анализирует морфологию и проверяет не реальное вхождение подстроки, а ищет однокорренные слова.

Можно ли всё-таки настроить запрос с помощью MATCH AGAINST, чтобы он находил подстроки внутри слов?
  • Вопрос задан
  • 271 просмотр
Подписаться 3 Средний Комментировать
Решения вопроса 1
@MaximaXXl
SELECT * FROM `table` 
WHERE 1 = 1
  and `column1` LIKE '%word1%' 
  and `column1` LIKE '%word2%'
  and `column1` LIKE '%word3%'
  and `column1` LIKE '%word4%'
  and `column1` LIKE '%word5%'
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Fernus
@Fernus
Техник - Механик :)
SELECT *
FROM `table`
WHERE LOCATE('word', `value`)
AND  LOCATE('word2', `value`)
AND LOCATE('word3', `value`)


???
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы