12 ポイント 投稿者 GN⁺ 2024-12-30 | 3件のコメント | WhatsAppで共有
  • 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オブジェクトのリストに対して高速なフルテキスト検索を行う
    1. クエリを正規表現に変換
    • 最新のJavaScriptエンジンに最適化された正規表現エンジンを活用し、クエリ文字列を正規表現フィルターへ変換して検索を実行
    • 例: “Uni of California” → (^|\W)Uni($|\W), (^|\W)of($|\W), (^|\W)California
    1. 正規表現マッチとドキュメント長に基づくTF-IDFランキングを計算
    • 文書内の単語数ではなく、文書の長さ(文字数)を使ってTF-IDFを近似

3件のコメント

 
yangeok 2025-01-06

ちょっとした問題が1つありますね..

 
beenzinozino 2025-01-04

興味があって見てみたのですが、3年間メンテナンスされていないんですね……。果たしてライブラリが完璧だからメンテナンスしていないのでしょうか……? 疑問が湧きます。

 
GN⁺ 2024-12-30
Hacker Newsのコメント
  • 115行のTypeScriptは軽量だが、重要な機能が欠けている可能性がある

    • さまざまなJavaScript代替手段のサイズ、機能セット、性能を比較できるリンクを提示
    • 数年前にuFuzzyを選んだ経験を共有
  • 検索機能は簡単に実装できるのだと気づいた

    • 非常に賢い正規表現エンジンだ
    • あいまい検索(例: Califnia の代わりに California)をどう処理するのかは不明だが、実装を理解するのは興味深い
  • JavaScriptアプリではFuseをよく使う

    • 多くのアプリ内検索がタイプミスを処理できず、もどかしい
  • FlexSearchやlunrのようなツールを使えば、数千件の項目に対するインデックス構築は非常に速い

    • ユーザーが検索インターフェースを開いたときにインデックスを構築し、使い終わったら忘れてしまっても構わない
  • インデックスがないことの利点は何か、という疑問

    • 小さくてシンプルなプログラムを好む
    • grepに似ているように見える