설치 | 개요 | 토큰화 | 형태소 분석 | 중지 단어 | 검색 색인 | 지수 전략
Js Search를 사용하면 JavaScript 및 JSON 개체에 대한 효율적인 클라이언트 측 검색이 가능합니다. ES5와 호환되며 jQuery나 기타 타사 라이브러리가 필요하지 않습니다.
Js Search는 런타임 성능 향상과 더 작은 파일 크기를 제공하는 Lunr JS의 경량 구현으로 시작되었습니다. 이후 형태소 분석, 불용어 및 TF-IDF 순위를 지원하는 풍부한 기능 세트를 포함하도록 확장되었습니다.
다음은 두 검색 라이브러리를 비교하는 JS Perf 벤치마크입니다. (더 나은 비교를 위해 Lunr 측면을 조정해 주신 Olivernn에게 감사드립니다!)
더 간단하고 웹 작업자에 최적화된 JS 검색 유틸리티를 찾고 있다면 js-worker-search를 확인하세요.
다음과 같이 Bower 또는 NPM을 사용하여 설치할 수 있습니다.
npm install js-search
bower install js-search
높은 수준에서는 검색을 위해 색인화해야 하는 필드를 알려주고 검색할 객체를 추가하여 Js Search를 구성합니다.
예를 들어 JS 검색의 간단한 사용은 다음과 같습니다.
import * as JsSearch from 'js-search' ;
var theGreatGatsby = {
isbn : '9781597226769' ,
title : 'The Great Gatsby' ,
author : {
name : 'F. Scott Fitzgerald'
} ,
tags : [ 'book' , 'inspirational' ]
} ;
var theDaVinciCode = {
isbn : '0307474275' ,
title : 'The DaVinci Code' ,
author : {
name : 'Dan Brown'
} ,
tags : [ 'book' , 'mystery' ]
} ;
var angelsAndDemons = {
isbn : '074349346X' ,
title : 'Angels & Demons' ,
author : {
name : 'Dan Brown' ,
} ,
tags : [ 'book' , 'mystery' ]
} ;
var search = new JsSearch . Search ( 'isbn' ) ;
search . addIndex ( 'title' ) ;
search . addIndex ( [ 'author' , 'name' ] ) ;
search . addIndex ( 'tags' )
search . addDocuments ( [ theGreatGatsby , theDaVinciCode , angelsAndDemons ] ) ;
search . search ( 'The' ) ; // [theGreatGatsby, theDaVinciCode]
search . search ( 'scott' ) ; // [theGreatGatsby]
search . search ( 'dan' ) ; // [angelsAndDemons, theDaVinciCode]
search . search ( 'mystery' ) // [angelsAndDemons, theDaVinciCode]
토큰화는 텍스트(예: 문장)를 더 작고 검색 가능한 토큰(예: 단어 또는 단어의 일부)으로 나누는 프로세스입니다. Js Search는 영어에 잘 작동하는 기본 토크나이저를 제공하지만 다음과 같이 직접 토크나이저를 제공할 수도 있습니다.
search . tokenizer = {
tokenize ( text /* string */ ) {
// Convert text to an Array of strings and return the Array
}
} ;
형태소 분석은 검색 토큰을 어근(또는 "어간")으로 줄여서 다양한 형태의 단어를 검색해도 여전히 결과를 얻을 수 있도록 하는 프로세스입니다. 예를 들어 "search", "searching" 및 "searched"는 모두 "search" 어간으로 축소될 수 있습니다.
Js Search는 자체 형태소 분석 라이브러리를 구현하지 않지만 타사 라이브러리를 사용하여 형태소 분석을 지원합니다.
형태소 분석을 활성화하려면 다음과 같이 StemmingTokenizer
사용하십시오.
var stemmer = require ( 'porter-stemmer' ) . stemmer ;
search . tokenizer =
new JsSearch . StemmingTokenizer (
stemmer , // Function should accept a string param and return a string
new JsSearch . SimpleTokenizer ( ) ) ;
불용어는 매우 일반적이며(예: a, an, the, of) 의미상 의미가 없는 경우가 많습니다. 기본적으로 Js Search는 이러한 단어를 필터링하지 않지만 다음과 같이 StopWordsTokenizer
를 사용하여 필터링을 활성화할 수 있습니다.
search . tokenizer =
new JsSearch . StopWordsTokenizer (
new JsSearch . SimpleTokenizer ( ) ) ;
기본적으로 Js Search는 www.ranks.nl/stopwords에 나열된 Google 기록 중지 단어의 약간 수정된 버전을 사용합니다. 다음과 같이 JsSearch.StopWordsMap
개체에서 값을 추가하거나 제거하여 이 중지 단어 목록을 수정할 수 있습니다.
JsSearch . StopWordsMap . the = false ; // Do not treat "the" as a stop word
JsSearch . StopWordsMap . bob = true ; // Treat "bob" as a stop word
불용어는 소문자이므로 대소문자를 구분하는 살균제를 사용하면 일부 불용어가 제거되지 않을 수 있습니다.
js-search
에는 두 가지 검색 색인이 패키지되어 있습니다.
용어 빈도-역 문서 빈도(또는 TF-IDF)는 단어(또는 단어)가 말뭉치 내의 문서에 얼마나 중요한지를 반영하기 위한 수치 통계입니다. TF-IDF 값은 문서에 단어가 나타나는 횟수에 비례하여 증가하지만 말뭉치에 있는 단어의 빈도에 따라 상쇄됩니다. 이는 일부 단어(예: and, or the)가 다른 단어보다 더 자주 나타나는 사실을 조정하는 데 도움이 됩니다.
기본적으로 Js Search는 TF-IDF 순위를 지원하지만 필요하지 않은 경우 성능상의 이유로 비활성화할 수 있습니다. TF-IDF를 비활성화하기 위해 다음과 같이 대체 ISearchIndex
구현을 지정할 수 있습니다.
// default
search . searchIndex = new JsSearch . TfIdfSearchIndex ( ) ;
// Search index capable of returning results matching a set of tokens
// but without any meaningful rank or order.
search . searchIndex = new JsSearch . UnorderedSearchIndex ( ) ;
js-search
에는 세 가지 인덱스 전략이 패키지되어 있습니다.
접두사 검색을 위한 PrefixIndexStrategy
인덱스입니다. (예: 용어 "cat"은 접두어 검색 조회를 허용하는 "c", "ca" 및 "cat"로 색인화됩니다.)
모든 하위 문자열에 대한 AllSubstringsIndexStrategy
인덱스입니다. 즉, "c", "ca", "cat", "a", "at" 및 "t"는 모두 "cat"과 일치합니다.
정확한 단어 일치를 위한 ExactWordIndexStrategy
인덱스입니다. 예를 들어 "bob"은 "bob jones"와 일치하지만 "bo"는 일치하지 않습니다.
기본적으로 Js Search는 접두사 인덱싱을 지원하지만 이는 구성 가능합니다. 다음과 같이 접두사 인덱싱을 비활성화하기 위해 대체 IIndexStrategy
구현을 지정할 수 있습니다.
// default
search . indexStrategy = new JsSearch . PrefixIndexStrategy ( ) ;
// this index strategy is built for all substrings matches.
search . indexStrategy = new JsSearch . AllSubstringsIndexStrategy ( ) ;
// this index strategy is built for exact word matches.
search . indexStrategy = new JsSearch . ExactWordIndexStrategy ( ) ;