Введение
В современных приложениях эффективный текстовый поиск имеет решающее значение, особенно при работе с большими базами данных. Хотя MySQL предоставляет базовые возможности полнотекстового поиска, он не справляется с нечетким сопоставлением или обработкой орфографических ошибок. Именно здесь в игру вступает поиск на основе триграмм. В этом блоге мы рассмотрим, что такое триграмма, как она повышает производительность поиска и как можно реализовать поиск по триграммам в MySQL.
Что такое триграмма?
Триграмма — это последовательность трех последовательных символов заданной строки. Например, слово «поиск» можно разбить на следующие триграммы:
Реализация триграммного поиска в MySQL путем создания временной таблицы
1. Создайте функцию триграммы в базе данных MySQL. Код функции триграммы:
CREATE FUNCTION TRIGRAM_SEARCH(search_string VARCHAR(255), target_string VARCHAR(255)) RETURNS FLOAT DETERMINISTIC BEGIN DECLARE i INT DEFAULT 1; DECLARE total_trigrams INT DEFAULT 0; DECLARE matched_trigrams INT DEFAULT 0; DECLARE search_length INT; DECLARE target_length INT; SET search_length = CHAR_LENGTH(search_string); SET target_length = CHAR_LENGTH(target_string); -- Handle edge cases where strings are too short IF search_length 0 THEN RETURN matched_trigrams / total_trigrams; ELSE RETURN 0; END IF; END;
2.Теперь индексируем нужный столбец в полнотекстовый
@Entity() @Index(['title'], { fulltext: true }) export class Ebook extends BaseEntity { @PrimaryGeneratedColumn() ebookId: number; @Column({ nullable: true }) title: string; }
3.Тестирование функции поиска по триграммам
select * FROM ebook e WHERE TRIGRAM_SEARCH('physis onlu', e.title) > 0.4 ORDER BY TRIGRAM_SEARCH('physis onlu', e.title) desc;
4.Реализовать триграммный поиск в коде
async find(title?: string) { const eBooks = await this.dataSource .getRepository(Ebook) .createQueryBuilder('eBook'); if (title) { eBooks.where(`TRIGRAM_SEARCH(:title, eBook.title) > 0.4`, { title }); } const result = await eBooks.getMany(); return result; }
Заключение
Поиск по триграммам предлагает мощный способ реализации нечеткого сопоставления в базах данных MySQL. Разбивая текст на триграммы, мы можем выполнять более гибкий и щадящий поиск, значительно улучшая взаимодействие с пользователем в приложениях, где текстовый поиск имеет решающее значение.
Хотя у этого подхода есть свои сильные стороны, важно рассмотреть альтернативы, такие как расстояние Левенштейна или алгоритмы Soundex, в зависимости от вашего конкретного варианта использования и требований к производительности.
Внедрив поиск по триграммам, вы можете значительно улучшить возможности поиска в своих приложениях Node.js и MySQL, предоставляя пользователям более интеллектуальные и щадящие результаты поиска.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3