12 puntos por GN⁺ 2024-12-30 | 3 comentarios | Compartir por WhatsApp
  • Una librería simple para realizar búsqueda de texto sin índice en JavaScript
  • Puede usarse en distintos proyectos y ofrece ordenamiento de resultados basado en TF-IDF junto con un rendimiento de búsqueda rápido
  • No tiene tantas funciones como FlexSearch o lunr.js, pero es mucho más rápida y eficiente que text.indexOf(query) > -1
  • Es útil para aplicaciones web simples que manejan conjuntos de datos pequeños

Funciones principales

  • Búsqueda sin índice: no requiere un proceso de indexación previo para buscar
  • Soporte para varias opciones de búsqueda:
    • distinción entre mayúsculas y minúsculas
    • búsqueda por palabra, búsqueda por prefijo y búsqueda estilo autocompletado
  • Rendimiento rápido: puede buscar incluso entre varios miles de elementos en tiempo real
  • Ranking TF-IDF: ordena los resultados de búsqueda por “mayor relevancia”

API

  • La función search recibe dos argumentos obligatorios y dos opcionales.
  • items: lista de elementos donde se buscará. Normalmente es un arreglo de cadenas o un arreglo de objetos con propiedades de tipo cadena.
  • query: la consulta de texto a buscar.
  • by (opcional): función que devuelve un valor de tipo cadena desde cada elemento. El valor predeterminado es x => String(x).
  • options (opcional): objeto que incluye opciones de búsqueda.
    • caseSensitive: si distingue entre mayúsculas y minúsculas. El valor predeterminado es false.
    • mode: forma de hacer coincidir palabras incompletas de la consulta.
      • mode: 'word': solo coincide con palabras completas.
      • mode: 'prefix': coincide con el prefijo de una palabra.
      • mode: 'autocomplete': modo híbrido donde la última palabra de la consulta puede estar incompleta.

Ejemplo de uso

import { search } from 'libsearch'; // entorno Node.js  
const { search } = window.libsearch; // entorno del navegador  
  
// Búsqueda básica  
search(articles, 'berkeley cali', a => a.title);  
// => [{ title: 'Weather in Berkeley, California' }]  
  
// Búsqueda por palabra: “California” busca solo “California”  
search(articles, 'california', a => a.title, { mode: 'word' });  
  
// Búsqueda con distinción entre mayúsculas y minúsculas: buscar con la “W” mayúscula  
search(articles, 'W', a => a.title, { caseSensitive: true });  
  
// Manejo de consulta vacía: devuelve todos los resultados  
search(articles, '', a => a.title);  

Cómo funciona la búsqueda

  • libsearch realiza búsquedas rápidas de texto completo sobre una lista de objetos JavaScript sin un índice de búsqueda preconstruido
    1. Convierte la consulta en una expresión regular
    • aprovecha el motor de expresiones regulares optimizado de los motores modernos de JavaScript para convertir la cadena de consulta en un filtro de expresión regular y ejecutar la búsqueda
    • ejemplo: “Uni of California” → (^|\W)Uni($|\W), (^|\W)of($|\W), (^|\W)California
    1. Calcula el ranking TF-IDF con base en coincidencias de expresiones regulares y la longitud del documento
    • usa la longitud del documento (número de caracteres) en lugar del número de palabras para aproximar TF-IDF

3 comentarios

 
yangeok 2025-01-06

Sí hay un detalle, eso sí..

 
beenzinozino 2025-01-04

Lo revisé porque me interesó, pero parece que no ha tenido mantenimiento en 3 años... ¿Será que la librería es tan perfecta que no necesita mantenimiento...? Me deja con dudas.

 
GN⁺ 2024-12-30
Comentarios en Hacker News
  • 115 líneas de TypeScript son bastante ligeras, pero podrían faltar funciones importantes

    • Se comparte un enlace para comparar el tamaño, el conjunto de funciones y el rendimiento de varias alternativas de JavaScript
    • Comparte la experiencia de haber elegido uFuzzy hace unos años
  • Se da cuenta de que es fácil implementar la función de búsqueda

    • Es un motor de expresiones regulares muy inteligente
    • No está claro cómo maneja las búsquedas difusas (por ejemplo, Califnia en lugar de California), pero resulta interesante entender la implementación
  • Usa Fuse con frecuencia en apps de JavaScript

    • Frustra que muchas búsquedas dentro de apps no puedan manejar errores tipográficos
  • Con herramientas como FlexSearch o lunr, construir un índice para miles de elementos es muy rápido

    • Está bien construir el índice cuando el usuario abre la interfaz de búsqueda y luego olvidarse de él después de usarlo
  • Pregunta cuál es la ventaja de no tener índice

    • Prefiere programas pequeños y simples
    • Se parece a grep bastante