"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Correspondance floue avec Trigram Search : création d'une recherche intelligente dans Node.js et MySQL

Correspondance floue avec Trigram Search : création d'une recherche intelligente dans Node.js et MySQL

Publié le 2024-11-09
Parcourir:626

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

Introduction
Dans les applications modernes, une recherche de texte efficace est cruciale, en particulier lorsqu'il s'agit de bases de données volumineuses. Bien que MySQL offre des fonctionnalités de base de recherche en texte intégral, il est insuffisant en matière de correspondance floue ou de gestion des fautes d'orthographe. C'est là qu'intervient la recherche basée sur les trigrammes. Dans ce blog, nous explorerons ce qu'est un trigramme, comment il améliore les performances de recherche et comment vous pouvez implémenter la recherche par trigramme dans MySQL.

Qu'est-ce qu'un trigramme ?
Un trigramme est une séquence de trois caractères consécutifs d'une chaîne donnée. Par exemple, le mot « recherche » peut être décomposé selon les trigrammes suivants :

  • mer
  • oreille
  • arc
  • rch En décomposant les mots en trigrammes, nous pouvons effectuer une correspondance de texte plus flexible et plus efficace, en particulier lorsque nous essayons de faire correspondre des termes incomplets ou légèrement mal orthographiés.

Implémentation de la recherche de trigrammes dans MySQL en créant une table temporaire

1.Créer une fonction trigramme dans la base de données MySQL. Code de fonction du trigramme :

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.Indexation maintenant de la colonne souhaitée vers le texte intégral

@Entity()
@Index(['title'], { fulltext: true })
export class Ebook extends BaseEntity {
  @PrimaryGeneratedColumn()
  ebookId: number;

  @Column({ nullable: true })
  title: string;
}

3.Test de la fonction de recherche de trigramme

select *
FROM ebook e 
WHERE TRIGRAM_SEARCH('physis onlu', e.title) > 0.4
ORDER BY TRIGRAM_SEARCH('physis onlu', e.title) desc;

4.Implémenter la recherche de trigrammes dans le code

 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;
  }

Conclusion
La recherche Trigram offre un moyen puissant d'implémenter la correspondance floue dans les bases de données MySQL. En décomposant le texte en trigrammes, nous pouvons effectuer des recherches plus flexibles et indulgentes, améliorant considérablement l'expérience utilisateur dans les applications où la recherche de texte est cruciale.
Bien que cette approche ait ses points forts, il est important d'envisager des alternatives telles que les algorithmes de distance de Levenshtein ou soundex en fonction de votre cas d'utilisation spécifique et de vos exigences de performances.
En implémentant la recherche par trigramme, vous pouvez améliorer considérablement les capacités de recherche de vos applications Node.js et MySQL, offrant ainsi aux utilisateurs des résultats de recherche plus intelligents et indulgents.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/mukesh_rajbanshi/fuzzy-matching-with-trigram-search-building-intelligent-search-in-nodejs-and-mysql-2839?1. En cas d'infraction, veuillez contacter study_golang@163 .comdelete
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3