12 pontos por GN⁺ 2024-12-30 | 3 comentários | Compartilhar no WhatsApp
  • Biblioteca simples para realizar busca de texto sem índice em JavaScript
  • Pode ser usada em vários projetos e oferece ordenação de resultados baseada em TF-IDF e desempenho de busca rápido
  • Não tem tantos recursos quanto FlexSearch ou lunr.js, mas é muito mais rápida e eficiente do que text.indexOf(query) > -1
  • Útil em aplicações web simples que lidam com conjuntos de dados menores

Principais recursos

  • Busca sem índice: não é necessário um processo de pré-indexação para pesquisar
  • Suporte a várias opções de busca:
    • diferenciação entre maiúsculas e minúsculas
    • suporte a busca por palavra, busca por prefixo e busca no estilo autocomplete
  • Desempenho rápido: é possível pesquisar alguns milhares de itens em tempo real
  • Ranking com TF-IDF: ordena os resultados da busca do "mais relevante" para baixo

API

  • A função search recebe dois argumentos obrigatórios e dois opcionais.
  • items: lista de itens a pesquisar. Normalmente é um array de strings ou um array de objetos com uma propriedade string.
  • query: consulta em string a ser pesquisada.
  • by (opcional): função que retorna um valor string do item. O padrão é x => String(x).
  • options (opcional): objeto que inclui opções de busca.
    • caseSensitive: diferencia maiúsculas de minúsculas. O padrão é false.
    • mode: forma de correspondência para palavras incompletas na consulta.
      • mode: 'word': corresponde apenas a palavras completas.
      • mode: 'prefix': corresponde pelo prefixo da palavra.
      • mode: 'autocomplete': modo híbrido em que a última palavra da consulta pode estar incompleta.

Exemplo de uso

import { search } from 'libsearch'; // ambiente Node.js  
const { search } = window.libsearch; // ambiente do navegador  
  
// Busca básica  
search(articles, 'berkeley cali', a => a.title);  
// => [{ title: 'Weather in Berkeley, California' }]  
  
// Busca por palavra: “California” busca apenas “California”  
search(articles, 'california', a => a.title, { mode: 'word' });  
  
// Busca com diferenciação de maiúsculas e minúsculas: busca por “W” maiúsculo  
search(articles, 'W', a => a.title, { caseSensitive: true });  
  
// Tratamento de consulta vazia: retorna todos os resultados  
search(articles, '', a => a.title);  

Como funciona a busca

  • libsearch realiza busca de texto completo rapidamente em uma lista de objetos JavaScript sem um índice de busca pré-construído
    1. Converte a consulta em uma expressão regular
    • aproveita o mecanismo de expressões regulares otimizado dos motores JavaScript modernos para transformar a string da consulta em um filtro por regex e executar a busca
    • exemplo: “Uni of California” → (^|\W)Uni($|\W), (^|\W)of($|\W), (^|\W)California
    1. Calcula o ranking TF-IDF com base nas correspondências da expressão regular e no comprimento do documento
    • usa o comprimento do documento (número de caracteres), em vez da contagem de palavras, para aproximar o TF-IDF

3 comentários

 
yangeok 2025-01-06

Tem um problema, sim..

 
beenzinozino 2025-01-04

Achei interessante e fui dar uma olhada, mas parece que está sem manutenção há 3 anos... Será que a biblioteca é tão perfeita que não precisa de manutenção...? Fico com essa dúvida.

 
GN⁺ 2024-12-30
Comentários no Hacker News
  • 115 linhas de TypeScript é algo leve, mas pode estar faltando funcionalidade importante

    • Foi compartilhado um link para comparar tamanho, conjunto de recursos e desempenho de várias alternativas em JavaScript
    • Relato de experiência escolhendo o uFuzzy alguns anos atrás
  • Percebeu que é fácil implementar funcionalidade de busca

    • É um mecanismo de expressões regulares muito inteligente
    • Não está claro como lida com busca aproximada (por exemplo, Califnia em vez de California), mas é interessante entender a implementação
  • Usa o Fuse com frequência em apps JavaScript

    • É frustrante que muitas buscas dentro de apps não consigam lidar com erros de digitação
  • Ao usar ferramentas como FlexSearch ou lunr, a construção de índice para milhares de itens é muito rápida

    • Dá para construir o índice quando o usuário abre a interface de busca e simplesmente descartá-lo depois do uso
  • Pergunta sobre qual é a vantagem de não ter índice

    • Prefere programas pequenos e simples
    • Parece semelhante ao grep