traverzeにスニペット機能を追加した

TECH
当サイトには広告・アフィリエイトリンクが含まれる場合があります。

先日、Rustで実装した全文検索エンジンtraverze公開したという話を投稿したのですが。

あれからすぐに、検索結果にスニペット(検索キーワード前後のテキストの断片)を含めたくなり、v0.2.0として公開しました。

ブログでの連絡はだいぶ遅れてしまいました。すみません、バタバタしてたんですよ…。

なお、繰り返しになりますが「Rustで実装した全文検索エンジン」という偉そうなのですが、中身はtantivyという全文検索エンジンとlinderaという形態素解析ライブラリを組み合わせた、ただのユーティリティラッパーです。先人たちに感謝。

v0.2.0の変更点

スニペット機能の追加

検索結果にクエリにマッチした箇所の前後テキストを抜粋表示できるようになりました。

  • インデックス構築時--with-snippetフラグを指定すると、ファイル本文をインデックスに保存し、スニペット生成に対応
  • 検索時--with-snippetフラグでスニペットを出力に含める
  • 出力フォーマット--snippet-format text|htmlでプレーンテキストまたは HTML 形式を選択可能
  • 文字数制御--snippet-max-chars <N>(デフォルト値=150)でスニペットの最大文字数を指定

内部ではtantivyのスニペット機能を利用しているだけです。

CLIとしての使用例

# スニペット対応のインデックスを構築
$ traverze index --with-snippet src/*.rs

# スニペット付きで検索
$ traverze search --with-snippet --snippet-format html "全文検索"

ライブラリとしての使用例

use traverze::{Traverze, SearchOptions, SnippetOptions, SnippetFormat};

let engine = Traverze::new_in_dir_for_indexing(&index_dir, mode, true)?; // with_snippet=true
engine.index_files(&files)?;

let options = SearchOptions {
    limit: 10,
    snippet: Some(SnippetOptions {
        max_num_chars: 200,
        format: SnippetFormat::Html,
    }),
};
let hits = engine.search_with_options("query", options)?;
for hit in hits {
    println!("{} (score: {:.3})", hit.path, hit.score);
    if let Some(snippet) = &hit.snippet {
        println!("  {}", snippet);
    }
}

インデックスのリセット機能の追加

CLIにindex --resetオプションを追加しました。

# インデックスの削除
$ traverze index --reset

これまでスニペット無しでインデクシングしていたところに、スニペット有りでインデクシングしようとするとインデックスファイルに不整合が起き、エラーが発生します。逆も同じです。

このとき、ユーザーができることは、インデックスファイルが整合するようにスニペットの有無を変更するか、インデックスファイルを作り直すかの二択しかないので、後者のためにこのオプションを追加しました。

README

より詳細はREADMEを参照のこと。でもこれ、英語なんですよねぇ。

カッコつけてるわけではなく、RustのクレートのREADMEが通常英語で書かれているからなのですが、ワタクシの英語力は壊滅的なため、当然生成AIに書いてもらってるわけです。次から翻訳版も追加しようかなーといまちょっと思いました。

インストール方法等は、前回の記事に記載してあります。

それでは良き全文検索ライフと生成AIライフを。

コメント

タイトルとURLをコピーしました