12P by neo 9일전 | favorite | 댓글 3개
  • JavaScript에서 인덱스 없이 텍스트 검색을 수행하는 간단한 라이브러리
  • 다양한 프로젝트에서 사용 가능하며, TF-IDF 기반의 결과 정렬과 빠른 검색 성능을 제공
  • FlexSearch나 lunr.js만큼의 기능은 없지만, text.indexOf(query) > -1보다 훨씬 빠르고 효율적임
  • 적은 데이터셋을 다루는 간단한 웹 애플리케이션에서 유용

주요 기능

  • 인덱스 없이 검색: 검색을 위해 사전 인덱싱 과정이 필요하지 않음
  • 다양한 검색 옵션 지원:
    • 대소문자 구분
    • 단어 검색, 접두어 검색, 자동완성 스타일 검색 지원
  • 빠른 성능: 몇 천 개의 항목도 실시간으로 검색 가능
  • TF-IDF 순위 제공: 검색 결과를 "가장 관련성 높은" 순서로 정렬

API

  • search 함수는 두 개의 필수 인자와 두 개의 선택적 인자를 받음.
  • items: 검색할 항목 리스트. 일반적으로 문자열 배열이나 문자열 속성을 가진 객체 배열임.
  • query: 검색할 문자열 쿼리.
  • by (선택적): 항목에서 문자열 값을 반환하는 함수. 기본값은 x => String(x)임.
  • options (선택적): 검색 옵션을 포함하는 객체.
    • caseSensitive: 대소문자 구분 여부. 기본값은 false.
    • mode: 불완전한 쿼리 단어를 매칭하는 방식.
      • mode: 'word': 완전한 단어만 매칭.
      • mode: 'prefix': 단어의 접두사로 매칭.
      • mode: 'autocomplete': 마지막 쿼리 단어가 불완전할 수 있는 하이브리드 모드.

사용 예제

import { search } from 'libsearch'; // Node.js 환경  
const { search } = window.libsearch; // 브라우저 환경  
  
// 기본 검색  
search(articles, 'berkeley cali', a => a.title);  
// => [{ title: 'Weather in Berkeley, California' }]  
  
// 단어 단위 검색: “California”는 “California”만 검색  
search(articles, 'california', a => a.title, { mode: 'word' });  
  
// 대소문자 구분 검색: 대문자 “W”로 검색  
search(articles, 'W', a => a.title, { caseSensitive: true });  
  
// 빈 검색어 처리: 전체 결과 반환  
search(articles, '', a => a.title);  

검색 방식

  • libsearch는 사전 구축된 검색 인덱스 없이 JavaScript 객체 리스트에서 빠르게 전체 텍스트 검색을 수행
    1. 쿼리를 정규식으로 변환
    • 현대 JavaScript 엔진의 최적화된 정규 표현식 엔진을 활용하여 쿼리 문자열을 정규 표현식 필터로 변환하여 검색 수행
    • 예: “Uni of California” → (^|\W)Uni($|\W), (^|\W)of($|\W), (^|\W)California
    1. 정규 표현식 매치와 문서 길이에 기반한 TF-IDF 랭킹 계산
    • 문서의 단어 수 대신 문서의 길이(문자 수)를 사용하여 TF-IDF를 근사화

이슈가 하나 있긴하네요..

관심있어서 살펴봤는데 3년째 유지보수가 안되고 있네요... 과연 라이브러리가 완벽해서 유지 보수를 안하고 있는걸까요...? 의문이 생깁니다.

Hacker News 의견
  • 115줄의 TypeScript는 가벼운 편이지만, 중요한 기능이 누락될 수 있음

    • 다양한 JavaScript 대안의 크기, 기능 세트, 성능을 비교할 수 있는 링크 제공
    • 몇 년 전 uFuzzy를 선택한 경험 공유
  • 검색 기능을 쉽게 구현할 수 있다는 점을 깨달음

    • 매우 똑똑한 정규 표현식 엔진임
    • 모호한 검색(예: Califnia 대신 California)을 어떻게 처리하는지는 불분명하지만, 구현을 이해하는 것이 흥미로움
  • 자바스크립트 앱에서 Fuse를 자주 사용함

    • 많은 앱 내 검색이 오타를 처리하지 못해 답답함
  • FlexSearch나 lunr와 같은 도구를 사용하면 수천 개의 항목에 대한 인덱스 구축이 매우 빠름

    • 사용자가 검색 인터페이스를 열 때 인덱스를 구축하고, 사용 후에는 잊어버려도 괜찮음
  • 인덱스가 없는 것의 이점은 무엇인가에 대한 질문

    • 작고 간단한 프로그램을 선호함
    • grep과 비슷해 보임