12 points par GN⁺ 2024-12-30 | 3 commentaires | Partager sur WhatsApp
  • Une bibliothèque simple pour effectuer une recherche textuelle sans index en JavaScript
  • Utilisable dans divers projets, avec un tri des résultats basé sur TF-IDF et de bonnes performances de recherche
  • Elle n'offre pas autant de fonctionnalités que FlexSearch ou lunr.js, mais elle est bien plus rapide et efficace que text.indexOf(query) > -1
  • Utile pour les applications web simples qui manipulent de petits jeux de données

Fonctionnalités principales

  • Recherche sans index : aucun processus de préindexation n'est nécessaire pour effectuer une recherche
  • Prise en charge de plusieurs options de recherche :
    • distinction majuscules/minuscules
    • recherche par mot, par préfixe et de type autocomplétion
  • Performances rapides : il est possible de rechercher en temps réel parmi quelques milliers d'éléments
  • Classement TF-IDF : les résultats sont triés du plus pertinent au moins pertinent

API

  • La fonction search prend deux arguments obligatoires et deux arguments optionnels.
  • items : la liste des éléments à parcourir. Il s'agit généralement d'un tableau de chaînes ou d'un tableau d'objets possédant une propriété de type chaîne.
  • query : la chaîne de requête à rechercher.
  • by (optionnel) : une fonction qui renvoie une valeur de type chaîne à partir d'un élément. La valeur par défaut est x => String(x).
  • options (optionnel) : un objet contenant les options de recherche.
    • caseSensitive : indique si la casse doit être respectée. La valeur par défaut est false.
    • mode : la manière de faire correspondre des mots de requête incomplets.
      • mode: 'word' : ne fait correspondre que des mots complets.
      • mode: 'prefix' : fait correspondre un préfixe de mot.
      • mode: 'autocomplete' : un mode hybride où le dernier mot de la requête peut être incomplet.

Exemples d'utilisation

import { search } from 'libsearch'; // environnement Node.js  
const { search } = window.libsearch; // environnement navigateur  
  
// Recherche de base  
search(articles, 'berkeley cali', a => a.title);  
// => [{ title: 'Weather in Berkeley, California' }]  
  
// Recherche par mot : “California” ne recherche que “California”  
search(articles, 'california', a => a.title, { mode: 'word' });  
  
// Recherche sensible à la casse : recherche avec la majuscule “W”  
search(articles, 'W', a => a.title, { caseSensitive: true });  
  
// Gestion d'une requête vide : renvoie tous les résultats  
search(articles, '', a => a.title);  

Méthode de recherche

  • libsearch effectue rapidement une recherche plein texte dans une liste d'objets JavaScript, sans index de recherche préconstruit
    1. Conversion de la requête en expression régulière
    • La recherche est effectuée en transformant la chaîne de requête en filtre d'expression régulière, en tirant parti du moteur d'expressions régulières optimisé des moteurs JavaScript modernes
    • Ex. : “Uni of California” → (^|\W)Uni($|\W), (^|\W)of($|\W), (^|\W)California
    1. Calcul d'un classement TF-IDF basé sur les correspondances de regex et la longueur du document
    • Utilise la longueur du document (nombre de caractères) au lieu du nombre de mots pour approximer le TF-IDF

3 commentaires

 
yangeok 2025-01-06

Il y a quand même un problème...

 
beenzinozino 2025-01-04

Je m’y suis intéressé et j’ai regardé, mais il semble qu’il n’y ait plus eu de maintenance depuis trois ans… Est-ce vraiment parce que la bibliothèque est parfaite au point de ne plus nécessiter de maintenance… ? Ça me laisse perplexe.

 
GN⁺ 2024-12-30
Commentaires sur Hacker News
  • 115 lignes de TypeScript, c’est plutôt léger, mais il peut manquer des fonctionnalités importantes

    • Lien fourni pour comparer la taille, l’ensemble des fonctionnalités et les performances de différentes alternatives JavaScript
    • Partage d’une expérience de choix de uFuzzy il y a quelques années
  • Prise de conscience qu’il est facile d’implémenter une fonction de recherche

    • Moteur d’expressions régulières très intelligent
    • On ne sait pas clairement comment sont gérées les recherches approximatives (par ex. Califnia au lieu de California), mais comprendre l’implémentation est intéressant
  • Utilise souvent Fuse dans des applications JavaScript

    • Frustration face au fait que beaucoup de recherches intégrées aux applications ne gèrent pas les fautes de frappe
  • Avec des outils comme FlexSearch ou lunr, la construction d’un index pour des milliers d’éléments est très rapide

    • On peut construire l’index quand l’utilisateur ouvre l’interface de recherche, puis l’oublier après usage
  • Question sur l’intérêt de ne pas avoir d’index

    • Préférence pour les programmes petits et simples
    • Cela ressemble à grep