sqlite okapi bm25
1.0.0
此 SQLite 扩展创建一个名为okapi_bm25
的 SQL 函数,该函数返回全文搜索结果的 Okapi BM25 排名。 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
函数必须使用'pcnalx'
作为第二个参数来调用。该参数定义了提供给okapi_bm25
函数的数据结构,该函数仅接受一种形式的数据。如果使用不同的第二个参数调用matchinfo
函数,则扩展可能会提供不正确的结果或完全无法工作。
okapi_bm25
函数一次仅计算一列的分数。 searchColumn
参数(在上例中为0
)指定将使用的列。该数字是 FTS 表中列的索引。以下是上述示例的架构:
CREATE VIRTUAL TABLE documents USING fts4(title, content);
在此架构中, title
列位于索引0
处,因为它是列出的第一列。如果顺序颠倒,则title
的正确索引将为1
。
最后两个可选参数k1
和b
是特定于 Okapi BM25 算法的自由参数。默认值为k1 = 1.2
和b = 0.75
。您可以调整这些以进行高级优化,但默认值可能会正常工作。
适用于 SQLite3 的 Okapi BM25 是根据 MIT 许可证发布的。