ПОЛНОТЕКСТОВЫЙ поиск с учетом пробелов и точек.

Вопрос или проблема

ПОЛНОТЕКСТОВЫЙ поиск с учетом пробелов и точек.

Я экспериментирую с FULLTEXT-поиском, используя механизм хранения InnoDB. Я обновляюсь с MYISAM на InnoDB и заметил, что многие запросы с использованием операторов LIKE, которые были быстрыми в MYISAM, стали гораздо медленнее в InnoDB. Удаление оператора LIKE и замена его на FULLTEXT-поиск происходит с молниеносной скоростью в InnoDB, но, похоже, это связано с некоторыми нюансами, о которых я не думал.

Парсер FULLTEXT определяет, где начинаются и заканчиваются слова, обращая внимание на определенные символы, включая пробелы ( ), запятые (,) и точки (‘.’). Многие строки в моей таблице содержат один или несколько из этих символов, и это вызывает у меня проблемы. Представьте, что в моей таблице есть 5 строк со строкой ‘test.demo’, и мой поисковой запрос ‘test.demo’ возвращает результаты, включая ‘demo’, ‘string.demo_example’ и т.д., потому что он ищет ‘demo’ вместо ‘test.demo’.

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

Ответ или решение

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

1. Изменение конфигурации парсера FULLTEXT

К сожалению, в MySQL нет возможности напрямую изменять поведение парсера FULLTEXT для обработки символов вроде точек и запятых. Полнотекстовый поиск изначально предназначен для поиска слов, а не для точного соответствия строк. Тем не менее, вы можете изменить некоторые настройki, которые могут оказать некоторое влияние на поиск.

  • Увеличение длины слова: Вы можете изменить значение переменной ft_min_word_len (минимальная длина слова) на менее 4 символов (по умолчанию). Это может помочь в некоторых случаях, но не решит проблему с поиском строк, содержащих специальные символы.

2. Использование дублирующего столбца

Как вы правильно отметили, можно создать дублирующий столбец, в котором будут храниться только «чистые» слова без пробелов и знаков препинания. Это можно сделать с помощью триггеров или при помощи функции, которая будет очищать данные перед вставкой в столбец.

Пример:

CREATE TABLE my_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    original_text TEXT,
    searchable_text TEXT,
    FULLTEXT (searchable_text)
);

-- Пример использования триггера для очищения строки
CREATE TRIGGER before_insert_my_table
BEFORE INSERT ON my_table
FOR EACH ROW
SET NEW.searchable_text = REPLACE(REPLACE(REPLACE(NEW.original_text, '.', ''), ',', ''), ' ', '');

Поиск в дублирующем столбце

После того, как вы настроили дублирующий столбец, просто выполните поиск по этому столбцу:

SELECT *
FROM my_table
WHERE MATCH (searchable_text) AGAINST ('testdemo');

3. Регулярные выражения

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

Пример:

SELECT *
FROM my_table
WHERE original_text REGEXP '(^|\\s)test\\.demo($|\\s)';

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...