Повнотекстовий пошук mySQL за 3 символами
Передмова

Створюючи двигун для свого інформаційного ресурсу Я, як і багато хто, зіткнувся з цікавою проблемою. Мені було просто конче необхідно реалізувати релевантний пошук рецептів по інгредієнтах. Багато інгредієнтів складалися з трьох символів, наприклад сир, цибуля, мед і т.д. Написавши кілька нехитрих рядків коду, я раптом виявив що пошук за трьома-символьними словами просто не проводиться. І тоді я згадав про те, що за умовчанням в налаштуваннях mySQL завжди і скрізь встановлений параметр ft_min_word_len = 4, який просто викидає слова менше чотирьох символів з пошукового рядка SQL запиту.
На жаль, проект не приносить стільки бабла, і окупитися виріб просто не може. Як відомо з документації mySQL, цей параметр може бути змінено динамічно. Я облазив весь інтернет, тисячі форумів, але адекватного рішення ніхто не мав. Були пропозиції вивантажувати всю БД в масив, організовувати релевантний пошук за допомогою чистого php, але мені страшно уявити, скільки для цього знадобиться ресурсів, особливо коли сайт розростеться до мільйона сторінок. Довелося думати самому, і рішення насправді лежить на поверхні, і займає пару рядків коду.
Давайте уявімо, що в нашій великій і могутній мові всі три буквені слова раптом різко перетворилися на ці буквені =) Ага, от і воно.Логічний алгоритм дуже простий, усі слова з трьох літер, і навіть найзнаменитіше слово, ми зберігатимемо у бд у 6 літерах, просто повторюючи їх двічі!
Так, зараз ви закричите, я не переписуватиму 5 000 текстів кожен із 10 000 знаків під таку белеберду, та й користувач ніколи не введе в пошуку «Як приготувати супсуп». Звичайно ні, і я кину спойлер на перед — не доведеться.
Базу доведеться перетворити один раз за допомогою регулярки, а потім ми напишемо дві функції, які будемо викликати для обробки будь-яких текстових запитів. Одну для введених даних форм, іншу для виведених з БД (вихідних). Функції складаються з одного короткого регулювання. Тобто:
- одна регулярка перетворює в тексті «Жил був дух» в «ЖилЖил був духдух» не чіпаючи слова що складаються з більшого і меншого кіл-ва символів.
- інша для виведення даних, шукає в тексті дебілі 6-літерні слова в яких перші три символи і останні три - повторюються.
Тепер на вході в БД (будь-які форми, реги і т.д.) ми проводимо через функцію DuhDuh, а будь-які вихідні дані навпаки через Duh.
Допомогою нехитрого циклу проганяємо нашу базу через функцію DuhDuh, щоб усі непристойні слова стали шести-літерними і збереглися в базі по-новому.
Виходить наступний алгоритм дій.
- Користувач вводить у пошуковий рядок "Що таке сир"
- Функція DuhDuh перетворює її на «Що таке сирир»
- Цей рядок відправляється в БД у повнотекстовий пошук, і повертає абсолютно нормальний результат, у вигляді «що таке сирир. Сирсир це молочний продукт ... »
- Проганяємо вихідний результат через функцію Duh і маємо наступний стрінг: Сир це молочний продукт.
- Радіємо рішенню, на радостях йдемо пити зеленийчай або кава.
А тепер для тих, хто не товаришує з регулярними виразами, що там написано на прикладі першої функції. Для другої - тренеруйте мозок самі =)