
Javascript de javascript rápido, extensível e independente, mecanismo de pesquisa de texto completo. Nó. Deno. Navegador.
npm install thinker-fts --save
JavaScript ESM
import Thinker from "thinker-fts" ;
const thinker = Thinker ( ) ;JavaScript Commonjs
const Thinker = require ( "thinker-fts" ) ;
const thinker = Thinker ( ) ;TypeScript
Observe que apenas a exportação padrão está disponível no Node.js TypeScript, pois o módulo Commonjs é usado internamente.
import Thinker from "thinker-fts" ;
const thinker = Thinker ( ) ;JavaScript
import Thinker from "https://cdn.jsdelivr.net/gh/hexagon/thinker-fts@2/dist/thinker.min.mjs" ;
const thinker = Thinker ( ) ;ou
import Thinker from "https://deno.land/x/thinker/dist/thinker.min.mjs" ;
const thinker = Thinker ( ) ;thinker.min.js (umd e independente) ou thinker.min.mjs (es-module) da dist/ pasta Para usar como um módulo UMD (independente, requerjs etc.)
< script src =" https://cdn.jsdelivr.net/npm/thinker-fts/dist/thinker.min.js " > </ script >Para usar como um módulo ES
< script type =" module " >
import Thinker from "https://cdn.jsdelivr.net/npm/thinker-fts/dist/thinker.min.mjs" ;
const thinker = Thinker ( ) ;
// ... see usage section ...
</ script > Uma configuração simples com alimentação e pesquisa seria algo como o trecho abaixo
// See installation section for exact procedure depending on environment, this is Node.js/CommonJS
const Thinker = require ( 'thinker-fts' ) ,
const thinker = Thinker ( ) ;
// Connect standard ranker
thinker . ranker = Thinker . rankers . standard ( ) ;
// Feed thinker with an array of documents formatted like { id: id, fields: [textfield, textfield] }
thinker . feed ( [
{ id : 1 , fields : [ 'Lorem' , 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.' ] } ,
{ id : 2 , fields : [ 'Ipsum' , 'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.' ] }
] ) ;
// Search for text
var result = thinker . find ( 'ut in' ) ;
// Show result
console . log ( result ) ;Resultados:
{
expressions: [
{
original: 'ut',
interpretation: [Object],
suggestion: undefined,
modifier: undefined,
exactMode: false
},
{
original: 'in',
interpretation: [Object],
suggestion: undefined,
modifier: undefined,
exactMode: false
}
],
performance: {
find: 1.107075,
rank: 0.598558,
sort: 0.688598,
filter: 0.060182,
total: 2.639159
},
documents: [
{ id: 2, weight: 1.5, expressions: [Object] },
{ id: 1, weight: 1.5, expressions: [Object] }
],
totalHits: 2,
returnedHits: 2
}
Não que você precise conectar um Ranker, caso contrário, o Find não fornecerá um conjunto de resultados. O Ranker constrói o conjunto de resultados.
A configuração padrão dos pensadores é substituída fornecendo um objeto de opções ao construtor de pensadores.
// Options only available at initialization
var thinker = Thinker ( {
characters : / ([a-zA-Z0-9]*) / g ,
caseSensitive : false ,
minWildcardWordLen : 3 ,
maxWildcardWordLen : 32 ,
minWordLen : 2 ,
maxWordLen : 32 ,
suggestionMinWordCount : 6 ,
enableSuggestions : false ,
optionalPlusFromExpressions : 1 ,
concatenateWords : 1
} ) ;Expressando regularmente afirmando quais personagens pegarem como palavras, se você (como exemplo) deseja usar o pensador com caracteres suecos, a configuração seria
{ characters : / ([a-zA-Z0-9åäöÅÄÖ]*) / g }Auto -explicativo, verdadeiro ou falso
O pensador sempre faz correspondência parcial, o MinWildCardWordlen define como as partes curtas das palavras que devem ser indexadas. A configuração padrão é 4, que corresponde a 'XPre' a 'expressão', mas não 'pré'. Definir isso muito curto pode dar uma quantidade desnecessária de partidas falsas e pode afetar o desempenho se usado com um ranker pesado.
O mesmo que acima, mas máx.
A palavra mais curta para indexar, o padrão é 2 que adiciona 'ex' ao índice, mas não 'e'
O mesmo que acima, mas máx.
Defina quantas vezes uma palavra precisa existir no índice a ser usado para sugestões. Padrões para 6.
Se isso estiver ativado, o pensador usará palavras não processadas dos textos inseridos para dar sugestões quando as expressões não dão uma correspondência direta.
É assim que os resultados.
Será renomeado, eu prometo.
É assim que muitas palavras devem haver na expressão antes que todas as palavras se tornem opcionais. Padrões para 1 (desativado).
Se você definir isso como 4 e procurar uma expressão de três palavras, todas as palavras precisarão existir no documento para corresponder. No fundo, what you want se tornar +what +you +want . Se você dá uma expressão de quatro palavras, todas as palavras se tornam opcionais como usuabl.
Quando essa propriedade é definida como maior que uma, as palavras aumentadas serão inseridas no índice, consistindo em atual e na próxima palavra. Se essa propriedade estiver definida como 3 e o campo for "eu quero cookies hoje", uma pesquisa por iwantcookies , wantcookiestoday ou wantcookies dará uma correspondência.
{
interpretation : {
original : 'expression' ,
...
} ,
...
suggestion : 'expression' ,
...
} O Ranker é configurado passando um objeto de opções para seu construtor.
var thinker = Thinker ( ) ,
ranker = Thinker . rankers . standard ( {
directHit : 1 ,
partialHit : 0.5 ,
eachPartialExpressionFactor : 1.5 ,
eachDirectExpressionFactor : 2 ,
fields : {
1 : { weight : 4 , boostPercentage : false } ,
2 : { weight : 2 , boostPercentage : false }
}
} ) ;
thinker . ranker = ranker ;Fator para o peso quando uma expressão corresponde a uma palavra diretamente resp. parcialmente
O fator que é aplicado a um documento total quando as expressões dão uma correspondência parcial. Se a consulta consistir em três expressões que correspondem parcialmente, esse fator será aplicado três vezes.
O mesmo que acima, mas com hits diretos.
Objeta definindo um peso base diferente para uma correspondência em cada campo de um documento, se seus documentos parecem
var docs = [
{ id : 1 , fields : [ "This is the title" , "This is the ingress" , "This is the text" ] } ,
...
] ;e seus pesos de seus campos parecem
fields: {
0 : { weight : 4 , boostPercentage : true } ,
1 : { weight : 2 , boostPercentage : false } ,
2 : { weight : 2 , boostPercentage : false }
}As partidas no campo do título teriam um peso de quatro, as partidas no campo de entrada teriam um peso de dois etc.
Além disso, como o BoostPercentage está definido como TRUE para o título, esse peso pode atingir seu dobro se a partida for a única palavra no título.
Por exemplo, se o título for 'isso é o material' e procuramos 'coisas', o peso da base é de quatro, e isso é multiplicado por um fator calculado
1 palavra correspondente, 4 palavras totalmente
1+1/4
1+0,25
fornece 1,25 em fator de bico -percentual
Os processadores de campo são funções aplicadas a todos os campos com os quais o pensador é alimentado, antes que a indexação seja feita.
Stripts html, deixando links (a href = " ") e descrições de imagem (img alt = " ") no resultado retornado.
Exemplo de configuração de pensador com Standard Ranker e Html-Stripping
var
thinker = Thinker ( ) ,
ranker = Thinker . rankers . standard ( ) ,
stripHtml = Thinker . processors . stripHtml ( ) ;
thinker . addFieldProcessor ( stripHtml ) ;
thinker . ranker = ranker ; Processadores de texto são funções aplicadas a cada palavra com que o pensador é alimentado. Eles são aplicados da mesma maneira, tanto na indexação quanto na consulta.
Os processadores de texto são tratados da mesma maneira que estão configurados, lembre -se disso ao configurar as coisas. Se você, por exemplo, conter a palavra antes de aplicar o WordForms, precisará usar palavras com capa na lista Wordforms.
Substitui as palavras escolhidas por outras pessoas, efetivamente fazendo com que os sinônimos entrem entre si.
Exemplo de configuração de pensador com Ranker e Wordforms padrão
var thinker = Thinker ( ) ,
ranker = Thinker . rankers . standard ( ) ,
wordforms = Thinker . processors . wordforms ( {
"we" : "us" ,
"they" : "them" ,
"github" : "repository"
} ) ;
thinker . addWordProcessor ( wordforms ) ;
thinker . ranker = ranker ;Remove palavras que não dão melhor precisão, normalmente coisas como 'e', 'i', 'eles', 'nós', 'podemos'. Adicionar as palavras mais comuns aqui pode acelerar um pouco os coros e salvar um pouco de RAM.
Exemplo de configuração do pensador com as palavras padrão e param
var thinker = Thinker ( ) ,
ranker = Thinker . rankers . standard ( ) ,
stopwords = Thinker . processors . stopwords ( {
"artikel" : true ,
"bemötande" : true
} ) ;
thinker . addWordProcessor ( stopwords ) ;
thinker . ranker = ranker ;Encontra o caule de cada palavra indexada, 'computadores' se tornará 'computador', 'organizado' se tornará 'organizar' etc. Isso melhora bastante a precisão das partidas e da ponderação.
Um recurso opcional do STEMMERS é fornecer uma lista de palavras que você não deseja diminuir.
Atualmente, existem dois candidatos disponíveis, suecos através de uma versão personalizada do algoritmo de bola de neve e inglês através do algoritmo Porter.
Exemplo de configuração de pensador com Standard Ranker, Inglês Stemming e algumas palavras de parada do STEMMER.
var
thinker = Thinker ( ) ,
ranker = Thinker . rankers . standard ( ) ,
stemmer = Thinker . processors . stemmers . english ( {
"stemmer" : true ,
"stemming" : true ,
"dontstemthiseither" : true ,
"leonardo" : true ,
"anders" , true
} ) ;
thinker . addWordProcessor ( stemmer ) ;
thinker . ranker = ranker ;Exemplo de configuração de pensador com Standard Ranker, Swedish Stemming e Stemmer Stop Words
var
thinker = Thinker ( ) ,
ranker = Thinker . rankers . standard ( ) ,
stemmer = Thinker . processors . stemmers . swedish ( {
"berta" : true ,
"jonas" : true ,
"leonardo" : true ,
"anders" : true
} ) ;
thinker . addWordProcessor ( stemmer ) ;
thinker . ranker = ranker ;O SoundEx pré -processos as palavras de tal maneira que as palavras que soam iguais se combinam.
Exemplo de configuração de pensador com o processamento SoundEx.
var
thinker = Thinker ( ) ,
ranker = Thinker . rankers . standard ( ) ,
soundex = Thinker . processors . soundex ( ) ;
thinker . addWordProcessor ( soundex ) ;
thinker . ranker = ranker ; Nota: Para uso normal, todas as dependências necessárias são agrupadas
Fast-Levenshtein (https://github.com/hiddentao/fast-levenshtein)
Stemmer (https://github.com/wooorm/stemmer)
Node-sondex (https://github.com/louist/node-soundex)
Mocha (https://github.com/mochajs/mocha)
deve (https://github.com/shouldjs/should.js)
Hexágono
Pehr Boman
Licenciado sob a licença do MIT