Installation | Aperçu | Tokenisation | Origine | Mots d’arrêt | Index de recherche | Stratégie indicielle
Js Search permet des recherches efficaces côté client d'objets JavaScript et JSON. Il est compatible ES5 et ne nécessite pas jQuery ou toute autre bibliothèque tierce.
Js Search a commencé comme une implémentation légère de Lunr JS, offrant des améliorations des performances d'exécution et une taille de fichier plus petite. Il s'est depuis étendu pour inclure un riche ensemble de fonctionnalités prenant en charge la recherche de radicaux, les mots vides et le classement TF-IDF.
Voici quelques benchmarks JS Perf comparant les deux bibliothèques de recherche. (Merci à olivernn d'avoir peaufiné le côté Lunr pour une meilleure comparaison !)
Si vous recherchez un utilitaire de recherche JS plus simple et optimisé pour les travailleurs Web, consultez js-worker-search.
Vous pouvez installer en utilisant Bower ou NPM comme ceci :
npm install js-search
bower install js-search
À un niveau élevé, vous configurez Js Search en lui indiquant les champs à indexer pour la recherche, puis en ajoutant les objets à rechercher.
Par exemple, une utilisation simple de JS Search serait la suivante :
import * as JsSearch from 'js-search' ;
var theGreatGatsby = {
isbn : '9781597226769' ,
title : 'The Great Gatsby' ,
author : {
name : 'F. Scott Fitzgerald'
} ,
tags : [ 'book' , 'inspirational' ]
} ;
var theDaVinciCode = {
isbn : '0307474275' ,
title : 'The DaVinci Code' ,
author : {
name : 'Dan Brown'
} ,
tags : [ 'book' , 'mystery' ]
} ;
var angelsAndDemons = {
isbn : '074349346X' ,
title : 'Angels & Demons' ,
author : {
name : 'Dan Brown' ,
} ,
tags : [ 'book' , 'mystery' ]
} ;
var search = new JsSearch . Search ( 'isbn' ) ;
search . addIndex ( 'title' ) ;
search . addIndex ( [ 'author' , 'name' ] ) ;
search . addIndex ( 'tags' )
search . addDocuments ( [ theGreatGatsby , theDaVinciCode , angelsAndDemons ] ) ;
search . search ( 'The' ) ; // [theGreatGatsby, theDaVinciCode]
search . search ( 'scott' ) ; // [theGreatGatsby]
search . search ( 'dan' ) ; // [angelsAndDemons, theDaVinciCode]
search . search ( 'mystery' ) // [angelsAndDemons, theDaVinciCode]
La tokenisation est le processus qui consiste à diviser le texte (par exemple des phrases) en jetons plus petits et consultables (par exemple des mots ou des parties de mots). Js Search fournit un tokenizer de base qui devrait bien fonctionner pour l'anglais, mais vous pouvez fournir le vôtre comme ceci :
search . tokenizer = {
tokenize ( text /* string */ ) {
// Convert text to an Array of strings and return the Array
}
} ;
La recherche de racines est le processus qui consiste à réduire les jetons de recherche à leur racine (ou « tige ») afin que les recherches sur différentes formes d'un mot donnent toujours des résultats. Par exemple, « recherche », « recherche » et « recherché » peuvent tous être réduits au radical « recherche ».
Js Search n'implémente pas sa propre bibliothèque de recherche de racines, mais il prend en charge la recherche de racines via l'utilisation de bibliothèques tierces.
Pour activer le stemming, utilisez StemmingTokenizer
comme ceci :
var stemmer = require ( 'porter-stemmer' ) . stemmer ;
search . tokenizer =
new JsSearch . StemmingTokenizer (
stemmer , // Function should accept a string param and return a string
new JsSearch . SimpleTokenizer ( ) ) ;
Les mots vides sont très courants (par exemple a, an et, the, of) et n'ont souvent pas de sens sémantique. Par défaut, Js Search ne filtre pas ces mots, mais le filtrage peut être activé en utilisant StopWordsTokenizer
comme ceci :
search . tokenizer =
new JsSearch . StopWordsTokenizer (
new JsSearch . SimpleTokenizer ( ) ) ;
Par défaut, Js Search utilise une version légèrement modifiée des mots vides de l'historique Google répertoriés sur www.ranks.nl/stopwords. Vous pouvez modifier cette liste de mots vides en ajoutant ou en supprimant des valeurs de l'objet JsSearch.StopWordsMap
comme ceci :
JsSearch . StopWordsMap . the = false ; // Do not treat "the" as a stop word
JsSearch . StopWordsMap . bob = true ; // Treat "bob" as a stop word
Notez que les mots vides sont en minuscules et que l'utilisation d'un correcteur sensible à la casse peut empêcher la suppression de certains mots vides.
Il existe deux index de recherche fournis avec js-search
.
Fréquence des termes – fréquence inverse des documents (ou TF-IDF) est une statistique numérique destinée à refléter l'importance d'un ou plusieurs mots pour un document au sein d'un corpus. La valeur TF-IDF augmente proportionnellement au nombre de fois qu'un mot apparaît dans le document mais est compensée par la fréquence du mot dans le corpus. Cela permet de tenir compte du fait que certains mots (par exemple et, ou, le) apparaissent plus fréquemment que d'autres.
Par défaut, Js Search prend en charge le classement TF-IDF, mais cela peut être désactivé pour des raisons de performances si cela n'est pas requis. Vous pouvez spécifier une autre implémentation ISearchIndex
afin de désactiver TF-IDF, comme ceci :
// default
search . searchIndex = new JsSearch . TfIdfSearchIndex ( ) ;
// Search index capable of returning results matching a set of tokens
// but without any meaningful rank or order.
search . searchIndex = new JsSearch . UnorderedSearchIndex ( ) ;
Il existe trois stratégies d'index fournies avec js-search
.
Index PrefixIndexStrategy
pour les recherches de préfixes. (par exemple, le terme « cat » est indexé comme « c », « ca » et « cat » permettant des recherches de préfixes).
Index AllSubstringsIndexStrategy
pour toutes les sous-chaînes. En d'autres termes, "c", "ca", "cat", "a", "at" et "t" correspondent tous à "cat".
Index ExactWordIndexStrategy
pour les correspondances de mots exacts. Par exemple, "bob" correspondra à "bob jones" (mais pas "bo").
Par défaut, Js Search prend en charge l'indexation des préfixes, mais celle-ci est configurable. Vous pouvez spécifier une autre implémentation IIndexStrategy
afin de désactiver l'indexation des préfixes, comme ceci :
// default
search . indexStrategy = new JsSearch . PrefixIndexStrategy ( ) ;
// this index strategy is built for all substrings matches.
search . indexStrategy = new JsSearch . AllSubstringsIndexStrategy ( ) ;
// this index strategy is built for exact word matches.
search . indexStrategy = new JsSearch . ExactWordIndexStrategy ( ) ;