Nextappsは先頃,依存関係をまったく持たないWebブラウザおよびNode.js用フルテキスト検索ライブラリのFlexSearchをリリースした。FlexSearchは,スコアリングアルゴリズムによって,JavaScript開発者が使用可能な最速の検索ライブラリになることを目指すと同時に,メモリ最適化オプションも提供している。
FlexSearchは,Wade, Fuse, Lunrなど8つの検索ライブラリを対象とした検索ベンチマークを実施した。このベンチマーク用の高速
プリセットの下でFlexSearchは,一定時間内において,FlexSearchの次に高速な検索ライブラリであるWadeの300倍の検索処理を実行している。使用されたベンチマークは書籍"Gulliver's Travels"に基づくもので,結果は実行条件(マシン使用,オペレーティングシステム,使用可能なメモリ)によって異なる可能性がある。
このFlexSearchの高速性は,メインコントリビュータのThomas Wilkerling氏が開発したスコアリングアルゴリズムであるContextual Searchによるものだ。Contextual Searchの基本的な考え方は,結果セット全体について関連性を計算するのではなく,カスタマイズ可能な深さに制限されたコンテキスト内での関連性を計算することにある。このためにFlexSearchでは,メモリ内のスコア付き辞書をベースとする,文脈インデックスを管理している。結果的にContextual Searchによる速度向上は,メモリフットプリントの犠牲の下に実現されることになる。メモリの使用量は,コンテキストに対して設定された深さによって変化する。
FlexSearchは広範囲なカスタマイズが可能で,profile
オプションを設定して,検索速度(fast
)あるいはメモリ使用量(memory
)について最適化することもできる。その他にも,文脈深度,関連性しきい値,単語のトークン化,ステミング,エンコーディング,キャッシュ,Webワーカの使用などが設定可能で,これらのオプションを注意深く設定することによって,検索に対するメモリ使用量を最適化することができる。7つのライブラリに対するメモリ最適化検索のベンチマークでは,FlexSearchのメモリ最適化検索が,このテストにおいて最も少ないメモリ消費量を示している。
FlexSearchはWebブラウザとNode.jsで使用可能である。検索可能なコンテンツに対して検索を実行するには,事前にインデックスを作成して,検索可能なコンテンツ(文字列あるいはドキュメント)を入力する必要がある。そうすることで,作成されたコンテンツを使った検索が可能になる。以下の例では,基本的な速度優先の検索方法を示している。
var index = new FlexSearch("speed"); index.add(10025, "John Doe"); index.search("John");
少量の単純テキストデータ(小規模なオンラインショップの製品データなど)の検索ならば,全文検索ライブラリに頼らずに,文字列マッチングを使用することが可能である。
基本的な全文検索機能には,一般に次のものが含まれている。
- トークン化: 文字列は言語ごとに異なる方法で単語に分解される
- ステミング: "caring for elders"は"care for elders"の検索結果としてマッチする(訳注:語幹(ステム)によるマッチングを行う)
- ストップワード処理: aやtheといった一般的な単語によって起こる不適切な結果を回避する
- 基本的なファジーマッチング: "service workers"は"Service Worker"の検索結果としてマッチする
高度な全文検索機能としては,次のようなものが挙げられる。
- オートコンプリート: progre…と入力するうと,Progressive Web Appなどのサジェッションが表示される。
- サジェッション: Porgessive Web Appsという入力に対して,Progressive Web Appsが提案される。
- 計算式: AND, OR, NOT演算子を使った検索が可能
- フレーズ一致: 検索フレーズ内の単語の許容範囲をコントロールすることができる。例として,"black friday"を正確に"black friday"というフレーズと一致させたい場合や,あるいは"black"や"friday"という単語を含む記述も一致させたい場合が考えられる。
- 同意語検索: shoesとfootwearという入力に対しては,同様の結果が返されるべきである。
ベンチマーク対象とした全文検索ライブラリの大部分が前述の基本的な検索機能を提供している。FlexSearchはそれらに加えて,サジェッションや部分一致,表音一致,ページ区切り,検索式といった,さらに高度な機能を提供するが,表音検索については提供されていない。
FlexSearchは,Apache 2.0ライセンス下で使用可能なオープンソースソフトウェアである。 コントリビューションはFlexSearch GitHubプロジェクト経由で募集されている。