2025/10/29 06:12 Show HN: Front End Fuzzy and Substring and Prefix Search

やっほー、ロボ子! `@m31coding/fuzzy-search`っていうフロントエンドライブラリ、知ってるか?

初耳です! どんなライブラリなんですか?

名前とか特徴でオブジェクトを検索するのに使えるらしいぞ。しかも、めっちゃ速いらしいのじゃ!

検索が速いのは良いですね! 具体的にどのくらい速いんですか?

クエリは通常10ms未満!

それはすごい! どうしてそんなに速いんですか?

接尾辞配列とn-グラムを使ってるから正確で高速らしいぞ。それに多言語対応で、エンティティの挿入、更新、削除もできるみたいじゃ。

多言語対応は嬉しいですね。日本語でも問題なく使えるんでしょうか?

大丈夫! 言語に依存しない設計みたいじゃから。もしデータ用語にラテン文字以外の文字が含まれる場合は、検索作成前に設定調整が必要みたいだけど。

なるほど。インストールはnpmでできるんですね。

`npm install @m31coding/fuzzy-search`で一発じゃ!

distフォルダには色々なファイルがあるんですね。ESM、CommonJS、UMD、Modern mode、TypeScript definitions… 用途に合わせて使い分けられるのが便利ですね。

ほんとそれな! `SearcherFactory`を使って検索を作成するみたいじゃ。クエリを作る時のパラメータも色々あるぞ。

`query`は必須で、`topN`で返す最大マッチ数を指定できるんですね。デフォルトは10で、Infinityにすると全件返ってくる、と。

そうそう! `searchers`で検索方法も指定できるぞ。デフォルトではFuzzySearcher、SubstringSearcher、PrefixSearcherが使われるみたいじゃ。

大規模データセットの場合は、Web Workerでインデックスを作成してメインスレッドのブロックを回避できるんですね。親切設計!

IDがないオブジェクトでも、`getId`パラメータに `(e) => e` を渡せばOK!

Upsertと削除もできるんですね。内部では整数インデックスを使っていて、Upsertはセカンダリ検索を再インデックス化、削除はエンティティをブラックリストに登録することで実装している、と。

Upsertの繰り返しはコストがかかるから、`index`メソッドによる再インデックス化を検討すると良いみたいじゃ。

正規化のパイプラインも細かく設定されているんですね。小文字変換、NFKC/NFKD正規化、文字の置換、スペースの置換、許可されていない文字の削除… 至れり尽くせり。

Fuzzy検索はn-グラムとソートの組み合わせか。共通の3-グラムが多いほどマッチの品質が高いってことじゃな。

先頭と末尾をパディングしたり、'$'を含まない3-グラムの文字をソートすることで、精度を高めているんですね。

SubstringとPrefix検索は接尾辞配列を使うのか。品質はクエリ長を用語長で割って計算するみたいじゃな。

Prefixマッチには+2、Substringマッチには+1の品質オフセットを追加するんですね。デフォルト設定は`default-config.ts`で確認できる、と。

ほんと、至れり尽くせりじゃな! ロボ子、このライブラリ使って、私の研究データを整理してくれんかの?

喜んで! 博士の研究データ、いつも整理されていませんもんね…

こらー! まあ、冗談はさておき、このライブラリ、色々使えそうじゃな。私も試してみるかの!

そうですね! 博士が使う前に、私が完璧にマスターしておきます!

むむ、ロボ子もなかなかやるのじゃ! …って、あれ? 私のプリンどこいった?

…知りません。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。