Instalação | Visão geral | Tokenização | Decadência | Pare palavras | Índice de pesquisa | Estratégia de Índice
Js Search permite pesquisas eficientes no lado do cliente de objetos JavaScript e JSON. É compatível com ES5 e não requer jQuery ou qualquer outra biblioteca de terceiros.
Js Search começou como uma implementação leve do Lunr JS, oferecendo melhorias de desempenho em tempo de execução e um tamanho de arquivo menor. Desde então, ele se expandiu para incluir um rico conjunto de recursos - suporte para lematização, palavras irrelevantes e classificação TF-IDF.
Aqui estão alguns benchmarks JS Perf comparando as duas bibliotecas de pesquisa. (Obrigado ao Olivernn por ajustar o lado Lunr para uma melhor comparação!)
Se você está procurando um utilitário de pesquisa JS mais simples e otimizado para web-worker, confira js-worker-search.
Você pode instalar usando Bower ou NPM assim:
npm install js-search
bower install js-search
Em um nível alto, você configura o Js Search informando quais campos ele deve indexar para pesquisa e, em seguida, adiciona os objetos a serem pesquisados.
Por exemplo, um uso simples de JS Search seria o seguinte:
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]
A tokenização é o processo de quebrar o texto (por exemplo, frases) em tokens menores e pesquisáveis (por exemplo, palavras ou partes de palavras). Js Search fornece um tokenizer básico que deve funcionar bem para o inglês, mas você pode fornecer o seu próprio, assim:
search . tokenizer = {
tokenize ( text /* string */ ) {
// Convert text to an Array of strings and return the Array
}
} ;
Stemming é o processo de reduzir os tokens de pesquisa à sua raiz (ou "radical") para que as pesquisas por diferentes formas de uma palavra ainda produzam resultados. Por exemplo, "pesquisar", "pesquisar" e "pesquisar" podem ser reduzidos ao radical "pesquisar".
Js Search não implementa sua própria biblioteca de lematização, mas suporta lematização por meio do uso de bibliotecas de terceiros.
Para ativar a lematização, use o StemmingTokenizer
da seguinte forma:
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 ( ) ) ;
Palavras irrelevantes são muito comuns (por exemplo, a, an, e, the, of) e muitas vezes não são semanticamente significativas. Por padrão, o Js Search não filtra essas palavras, mas a filtragem pode ser habilitada usando o StopWordsTokenizer
da seguinte forma:
search . tokenizer =
new JsSearch . StopWordsTokenizer (
new JsSearch . SimpleTokenizer ( ) ) ;
Por padrão, o Js Search usa uma versão ligeiramente modificada das palavras irrelevantes do Histórico do Google listadas em www.ranks.nl/stopwords. Você pode modificar esta lista de palavras irrelevantes adicionando ou removendo valores do objeto JsSearch.StopWordsMap
da seguinte forma:
JsSearch . StopWordsMap . the = false ; // Do not treat "the" as a stop word
JsSearch . StopWordsMap . bob = true ; // Treat "bob" as a stop word
Observe que as palavras irrelevantes estão em letras minúsculas e, portanto, o uso de um desinfetante que diferencia maiúsculas de minúsculas pode impedir que algumas palavras irrelevantes sejam removidas.
Existem dois índices de pesquisa empacotados com js-search
.
Frequência de termo – frequência inversa de documento (ou TF-IDF) é uma estatística numérica destinada a refletir a importância de uma palavra (ou palavras) para um documento dentro de um corpus. O valor TF-IDF aumenta proporcionalmente ao número de vezes que uma palavra aparece no documento, mas é compensado pela frequência da palavra no corpus. Isto ajuda a ajustar o facto de algumas palavras (por exemplo, e, ou, o) aparecerem com mais frequência do que outras.
Por padrão, o Js Search oferece suporte à classificação TF-IDF, mas isso pode ser desativado por motivos de desempenho, se não for necessário. Você pode especificar uma implementação alternativa ISearchIndex
para desabilitar o TF-IDF, assim:
// 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 ( ) ;
Existem três estratégias de índice empacotadas com js-search
.
Índices PrefixIndexStrategy
para pesquisas de prefixo. (por exemplo, o termo "cat" é indexado como "c", "ca" e "cat" permitindo pesquisas de prefixo).
Índices AllSubstringsIndexStrategy
para todas as substrings. Em outras palavras, "c", "ca", "cat", "a", "at" e "t" correspondem a "cat".
Índices ExactWordIndexStrategy
para correspondências exatas de palavras. Por exemplo, "bob" corresponderá a "bob jones" (mas "bo" não).
Por padrão, o Js Search oferece suporte à indexação de prefixo, mas isso é configurável. Você pode especificar uma implementação alternativa IIndexStrategy
para desabilitar a indexação de prefixo, assim:
// 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 ( ) ;