インストール |概要 |トークン化 |ステミング |ストップワード |検索インデックス |インデックス戦略
Js Search を使用すると、クライアント側で JavaScript および JSON オブジェクトを効率的に検索できます。 ES5 と互換性があり、jQuery やその他のサードパーティ ライブラリは必要ありません。
Js Search は、Lunr JS の軽量実装として始まり、実行時のパフォーマンスの向上とファイル サイズの縮小を実現しました。それ以来、ステミング、ストップワード、TF-IDF ランキングをサポートする豊富な機能セットが含まれるように拡張されました。
以下に、2 つの検索ライブラリを比較した JS Perf ベンチマークをいくつか示します。 (比較しやすいように Lunr 側を調整してくれた olivernn に感謝します!)
よりシンプルで Web ワーカーに最適化された JS 検索ユーティリティを探している場合は、js-worker-search をチェックしてください。
次のように Bower または NPM を使用してインストールできます。
npm install js-search
bower install js-search
高レベルでは、検索用にどのフィールドにインデックスを付ける必要があるかを指定して Js Search を構成し、検索対象のオブジェクトを追加します。
たとえば、JS Search の簡単な使用法は次のようになります。
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、and、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
には 2 つの検索インデックスがパッケージ化されています。
用語頻度 - 逆文書頻度 (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
には 3 つのインデックス戦略がパッケージ化されています。
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 ( ) ;