- JavaScriptでインデックスなしのテキスト検索を行うシンプルなライブラリ
- さまざまなプロジェクトで利用でき、TF-IDFベースの結果ソートと高速な検索性能を提供
- FlexSearchやlunr.jsほどの機能はないが、
text.indexOf(query) > -1よりはるかに高速で効率的
- 小規模なデータセットを扱うシンプルなWebアプリケーションで有用
主な機能
- インデックス不要の検索: 検索のための事前インデックス作成が不要
- 多様な検索オプションに対応:
- 大文字・小文字の区別
- 単語検索、接頭辞検索、オートコンプリート風検索に対応
- 高速な性能: 数千件の項目でもリアルタイム検索が可能
- TF-IDFランキングを提供: 検索結果を「最も関連性が高い」順に並べ替え
API
search 関数は2つの必須引数と2つの省略可能引数を受け取る。
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件のコメント
ちょっとした問題が1つありますね..
興味があって見てみたのですが、3年間メンテナンスされていないんですね……。果たしてライブラリが完璧だからメンテナンスしていないのでしょうか……? 疑問が湧きます。
Hacker Newsのコメント
115行のTypeScriptは軽量だが、重要な機能が欠けている可能性がある
検索機能は簡単に実装できるのだと気づいた
JavaScriptアプリではFuseをよく使う
FlexSearchやlunrのようなツールを使えば、数千件の項目に対するインデックス構築は非常に速い
インデックスがないことの利点は何か、という疑問