Instalación | Descripción general | Tokenización | Derivado | Detener palabras | Índice de búsqueda | Estrategia de índice
Js Search permite búsquedas eficientes del lado del cliente de objetos JavaScript y JSON. Es compatible con ES5 y no requiere jQuery ni ninguna otra biblioteca de terceros.
Js Search comenzó como una implementación ligera de Lunr JS, que ofrecía mejoras en el rendimiento del tiempo de ejecución y un tamaño de archivo más pequeño. Desde entonces, se ha ampliado para incluir un rico conjunto de funciones que admiten derivaciones, palabras vacías y clasificación TF-IDF.
A continuación se muestran algunos puntos de referencia de JS Perf que comparan las dos bibliotecas de búsqueda. (¡Gracias a olivernn por modificar el lado Lunr para una mejor comparación!)
Si está buscando una utilidad de búsqueda JS más sencilla y optimizada para trabajadores web, consulte js-worker-search.
Puede instalar usando Bower o NPM de esta manera:
npm install js-search
bower install js-search
En un nivel alto, configura Js Search diciéndole qué campos debe indexar para la búsqueda y luego agrega los objetos que se buscarán.
Por ejemplo, un uso sencillo de JS Search sería el siguiente:
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 tokenización es el proceso de dividir el texto (por ejemplo, oraciones) en tokens más pequeños que se pueden buscar (por ejemplo, palabras o partes de palabras). Js Search proporciona un tokenizador básico que debería funcionar bien en inglés, pero puedes proporcionar el tuyo propio de esta manera:
search . tokenizer = {
tokenize ( text /* string */ ) {
// Convert text to an Array of strings and return the Array
}
} ;
La derivación es el proceso de reducir los tokens de búsqueda a su raíz (o "raíz") para que las búsquedas de diferentes formas de una palabra sigan dando resultados. Por ejemplo, "buscar", "buscando" y "buscado" se pueden reducir a la raíz "buscar".
Js Search no implementa su propia biblioteca de derivación, pero admite la derivación mediante el uso de bibliotecas de terceros.
Para habilitar la derivación, use StemmingTokenizer
de esta manera:
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 ( ) ) ;
Las palabras vacías son muy comunes (p. ej., a, an, and, the, of) y a menudo no tienen significado semántico. De forma predeterminada, Js Search no filtra estas palabras, pero el filtrado se puede habilitar usando StopWordsTokenizer
de esta manera:
search . tokenizer =
new JsSearch . StopWordsTokenizer (
new JsSearch . SimpleTokenizer ( ) ) ;
De forma predeterminada, Js Search utiliza una versión ligeramente modificada de las palabras vacías del historial de Google que figuran en www.ranks.nl/stopwords. Puede modificar esta lista de palabras vacías agregando o eliminando valores del objeto JsSearch.StopWordsMap
de esta manera:
JsSearch . StopWordsMap . the = false ; // Do not treat "the" as a stop word
JsSearch . StopWordsMap . bob = true ; // Treat "bob" as a stop word
Tenga en cuenta que las palabras vacías están en minúsculas, por lo que el uso de un desinfectante que distinga entre mayúsculas y minúsculas puede evitar que se eliminen algunas palabras vacías.
Hay dos índices de búsqueda empaquetados con js-search
.
Frecuencia de términos: frecuencia inversa de documentos (o TF-IDF) es una estadística numérica destinada a reflejar la importancia de una palabra (o palabras) para un documento dentro de un corpus. El valor TF-IDF aumenta proporcionalmente al número de veces que aparece una palabra en el documento, pero se compensa con la frecuencia de la palabra en el corpus. Esto ayuda a tener en cuenta el hecho de que algunas palabras (p. ej., y, o, el) aparecen con más frecuencia que otras.
De forma predeterminada, Js Search admite la clasificación TF-IDF, pero esto se puede deshabilitar por razones de rendimiento si no es necesario. Puede especificar una implementación alternativa ISearchIndex
para deshabilitar TF-IDF, así:
// 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 ( ) ;
Hay tres estrategias de índice empaquetadas con js-search
.
Índices PrefixIndexStrategy
para búsquedas de prefijos. (por ejemplo, el término "cat" está indexado como "c", "ca" y "cat", lo que permite realizar búsquedas de prefijos).
Índices AllSubstringsIndexStrategy
para todas las subcadenas. En otras palabras, "c", "ca", "cat", "a", "at" y "t" coinciden con "cat".
Índices ExactWordIndexStrategy
para coincidencias exactas de palabras. Por ejemplo, "bob" coincidirá con "bob jones" (pero "bo" no).
De forma predeterminada, Js Search admite la indexación de prefijos, pero esto es configurable. Puede especificar una implementación alternativa IIndexStrategy
para deshabilitar la indexación de prefijos, así:
// 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 ( ) ;