Installation | Übersicht | Tokenisierung | Stemmen | Stoppwörter | Suchindex | Indexstrategie
Js Search ermöglicht eine effiziente clientseitige Suche nach JavaScript- und JSON-Objekten. Es ist ES5-kompatibel und erfordert weder jQuery noch andere Bibliotheken von Drittanbietern.
Js Search begann als einfache Implementierung von Lunr JS und bot Verbesserungen der Laufzeitleistung und eine kleinere Dateigröße. Seitdem wurde es um einen umfangreichen Funktionsumfang erweitert, der Wortstammerkennung, Stoppwörter und TF-IDF-Ranking unterstützt.
Hier sind einige JS Perf-Benchmarks, die die beiden Suchbibliotheken vergleichen. (Vielen Dank an olivernn für die Optimierung der Lunr-Seite für einen besseren Vergleich!)
Wenn Sie nach einem einfacheren, für Web-Worker optimierten JS-Suchdienstprogramm suchen, schauen Sie sich js-worker-search an.
Sie können die Installation entweder mit Bower oder NPM wie folgt durchführen:
npm install js-search
bower install js-search
Auf einer hohen Ebene konfigurieren Sie Js Search, indem Sie ihm mitteilen, welche Felder für die Suche indiziert werden sollen, und dann die zu durchsuchenden Objekte hinzufügen.
Eine einfache Verwendung von JS Search wäre beispielsweise wie folgt:
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]
Bei der Tokenisierung wird Text (z. B. Sätze) in kleinere, durchsuchbare Token (z. B. Wörter oder Wortteile) zerlegt. Js Search bietet einen einfachen Tokenizer, der gut für Englisch funktionieren sollte, Sie können aber auch Ihren eigenen Tokenizer wie folgt bereitstellen:
search . tokenizer = {
tokenize ( text /* string */ ) {
// Convert text to an Array of strings and return the Array
}
} ;
Bei der Wortstammerkennung werden Suchtokens auf ihre Wurzel (oder ihren „Stamm“) reduziert, sodass die Suche nach verschiedenen Wortformen weiterhin Ergebnisse liefert. Beispielsweise können „search“, „searching“ und „searched“ alle auf den Stamm „search“ reduziert werden.
Js Search implementiert keine eigene Stemming-Bibliothek, unterstützt jedoch Stemming durch die Verwendung von Bibliotheken von Drittanbietern.
Um Stemming zu aktivieren, verwenden Sie den StemmingTokenizer
wie folgt:
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 ( ) ) ;
Stoppwörter kommen sehr häufig vor (z. B. a, an, and, the, of) und haben oft keine semantische Bedeutung. Standardmäßig filtert Js Search diese Wörter nicht, die Filterung kann jedoch mit dem StopWordsTokenizer
wie folgt aktiviert werden:
search . tokenizer =
new JsSearch . StopWordsTokenizer (
new JsSearch . SimpleTokenizer ( ) ) ;
Standardmäßig verwendet Js Search eine leicht modifizierte Version der auf www.ranks.nl/stopwords aufgeführten Google History-Stoppwörter. Sie können diese Liste von Stoppwörtern ändern, indem Sie dem JsSearch.StopWordsMap
Objekt wie folgt Werte hinzufügen oder daraus entfernen:
JsSearch . StopWordsMap . the = false ; // Do not treat "the" as a stop word
JsSearch . StopWordsMap . bob = true ; // Treat "bob" as a stop word
Beachten Sie, dass Stoppwörter in Kleinbuchstaben geschrieben sind. Daher kann die Verwendung einer Groß-/Kleinschreibungsbereinigung dazu führen, dass einige Stoppwörter nicht entfernt werden.
Es gibt zwei Suchindizes, die mit js-search
gepackt sind.
Begriffshäufigkeit – inverse Dokumenthäufigkeit (oder TF-IDF) ist eine numerische Statistik, die widerspiegeln soll, wie wichtig ein Wort (oder mehrere Wörter) für ein Dokument innerhalb eines Korpus sind. Der TF-IDF-Wert steigt proportional zur Häufigkeit, mit der ein Wort im Dokument vorkommt, wird jedoch durch die Häufigkeit des Wortes im Korpus ausgeglichen. Dies trägt dazu bei, die Tatsache auszugleichen, dass einige Wörter (z. B. und, oder, die) häufiger vorkommen als andere.
Standardmäßig unterstützt Js Search das TF-IDF-Ranking, dies kann jedoch aus Leistungsgründen deaktiviert werden, wenn es nicht erforderlich ist. Sie können eine alternative ISearchIndex
Implementierung angeben, um TF-IDF zu deaktivieren, etwa so:
// 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 ( ) ;
Es gibt drei Indexstrategien, die mit js-search
gepackt sind.
PrefixIndexStrategy
Indizes für Präfixsuchen. (z. B. wird der Begriff „cat“ als „c“, „ca“ und „cat“ indiziert, was eine Suche nach Präfixen ermöglicht).
AllSubstringsIndexStrategy
Indizes für alle Teilzeichenfolgen. Mit anderen Worten: „c“, „ca“, „cat“, „a“, „at“ und „t“ stimmen alle mit „cat“ überein.
ExactWordIndexStrategy
Indizes für exakte Wortübereinstimmungen. Beispielsweise stimmt „bob“ mit „bob jones“ überein (aber „bo“ nicht).
Standardmäßig unterstützt Js Search die Präfixindizierung, dies ist jedoch konfigurierbar. Sie können eine alternative IIndexStrategy
Implementierung angeben, um die Präfixindizierung zu deaktivieren, etwa so:
// 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 ( ) ;