«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Нечеткое сопоставление с триграммным поиском: построение интеллектуального поиска в Node.js и MySQL

Нечеткое сопоставление с триграммным поиском: построение интеллектуального поиска в Node.js и MySQL

Опубликовано 9 ноября 2024 г.
Просматривать:313

Fuzzy Matching with Trigram Search: Building Intelligent Search in Node.js and MySQL

Введение
В современных приложениях эффективный текстовый поиск имеет решающее значение, особенно при работе с большими базами данных. Хотя 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, предоставляя пользователям более интеллектуальные и щадящие результаты поиска.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/mukesh_rajbanshi/fuzzy-matching-with-trigram-search-building-intelligent-search-in-nodejs-and-mysql-2839?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с Study_golang@163 .comdelete
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3