- 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
-
- 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
-
- 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
Il y a quand même un problème...
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.
Commentaires sur Hacker News
115 lignes de TypeScript, c’est plutôt léger, mais il peut manquer des fonctionnalités importantes
Prise de conscience qu’il est facile d’implémenter une fonction de recherche
Califniaau lieu deCalifornia), mais comprendre l’implémentation est intéressantUtilise souvent Fuse dans des applications JavaScript
Avec des outils comme FlexSearch ou lunr, la construction d’un index pour des milliers d’éléments est très rapide
Question sur l’intérêt de ne pas avoir d’index
grep