GN⁺: Libsearch - JavaScript용 간단한 인덱스 없는 전체 텍스트 검색
(github.com/thesephist)- 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 객체 리스트에서 빠르게 전체 텍스트 검색을 수행
-
- 쿼리를 정규식으로 변환
- 현대 JavaScript 엔진의 최적화된 정규 표현식 엔진을 활용하여 쿼리 문자열을 정규 표현식 필터로 변환하여 검색 수행
- 예: “Uni of California” → (^|\W)Uni($|\W), (^|\W)of($|\W), (^|\W)California
-
- 정규 표현식 매치와 문서 길이에 기반한 TF-IDF 랭킹 계산
- 문서의 단어 수 대신 문서의 길이(문자 수)를 사용하여 TF-IDF를 근사화
관심있어서 살펴봤는데 3년째 유지보수가 안되고 있네요... 과연 라이브러리가 완벽해서 유지 보수를 안하고 있는걸까요...? 의문이 생깁니다.
Hacker News 의견
-
115줄의 TypeScript는 가벼운 편이지만, 중요한 기능이 누락될 수 있음
- 다양한 JavaScript 대안의 크기, 기능 세트, 성능을 비교할 수 있는 링크 제공
- 몇 년 전 uFuzzy를 선택한 경험 공유
-
검색 기능을 쉽게 구현할 수 있다는 점을 깨달음
- 매우 똑똑한 정규 표현식 엔진임
- 모호한 검색(예: Califnia 대신 California)을 어떻게 처리하는지는 불분명하지만, 구현을 이해하는 것이 흥미로움
-
자바스크립트 앱에서 Fuse를 자주 사용함
- 많은 앱 내 검색이 오타를 처리하지 못해 답답함
-
FlexSearch나 lunr와 같은 도구를 사용하면 수천 개의 항목에 대한 인덱스 구축이 매우 빠름
- 사용자가 검색 인터페이스를 열 때 인덱스를 구축하고, 사용 후에는 잊어버려도 괜찮음
-
인덱스가 없는 것의 이점은 무엇인가에 대한 질문
- 작고 간단한 프로그램을 선호함
- grep과 비슷해 보임