この SQLite 拡張機能は、全文検索の結果に対するokapi BM25 ランキングを返すokapi_bm25
という SQL 関数を作成します。 okapi BM25 は、検索クエリとの関連性に基づいて各結果のスコアを計算する最新のランキング関数です。この拡張機能は、FTS4 テーブルのMATCH
クエリでのみ機能します。
拡張機能はまずソースからコンパイルする必要があります。
$ make
gcc -Wall -Werror -bundle -fPIC -Isqlite3 -o okapi_bm25.sqlext okapi_bm25.c
コンパイルされたokapi_bm25.sqlext
ファイルは、SQLite 拡張機能としてロードできます。これを行う方法は、使用している言語によって異なります。たとえば、node-sqlite3 バインディングには、プログラムの開始時に呼び出すことができる特別な拡張 API があります。コンソールから SQLite を使用している場合は、 .load
コマンドを使用して、現在のセッションの拡張機能をロードします。
sqlite> .load ./okapi_bm25.sqlext
ランキング関数は、組み込みの matchinfo 関数を使用して、スコアの計算に必要なデータを取得します。単純な検索クエリは次のようになります。
SELECT title FROM documents
WHERE title MATCH <query>
ORDER BY okapi_bm25(matchinfo(documents, 'pcnalx'), 0) DESC
matchinfo
関数は、2 番目の引数として'pcnalx'
指定して呼び出す必要があります。この引数は、 okapi_bm25
関数に与えられるデータの構造を定義します。この関数は 1 つの形式でのみデータを受け入れます。 matchinfo
関数が異なる 2 番目の引数を指定して呼び出された場合、拡張機能は間違った結果を返したり、完全に機能しなかったりする可能性があります。
okapi_bm25
関数は、一度に 1 つの列のスコアのみを計算します。上記の例では0
として指定されているsearchColumn
引数は、使用する列を指定します。この数字は、FTS テーブル内の列のインデックスです。上記の例のスキーマは次のとおりです。
CREATE VIRTUAL TABLE documents USING fts4(title, content);
このスキーマでは、 title
列はリストの最初の列であるため、インデックス0
にあります。順序が逆の場合、 title
の正しいインデックスは1
になります。
最後の 2 つのオプションの引数k1
とb
、Okapi BM25 アルゴリズムに固有の自由パラメーターです。デフォルト値はk1 = 1.2
およびb = 0.75
です。これらを微調整して高度な最適化を行うこともできますが、おそらくデフォルトのままで問題なく動作します。
okapi BM25 for SQLite3 は MIT ライセンスに基づいてリリースされています。