12P by GN⁺ | ★ 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를 근사화
GeekNews Weekly에 포함된 글입니다. 에디터 코멘트 보기

댓글과 토론

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

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

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

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

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

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

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

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