Esta extensión SQLite crea una función SQL llamada okapi_bm25
que devuelve la clasificación de Okapi BM25 para los resultados de una búsqueda de texto completo. Okapi BM25 es una función de clasificación moderna que calcula una puntuación para cada resultado en función de su relevancia para la consulta de búsqueda. Esta extensión sólo funciona con consultas MATCH
en tablas FTS4.
La extensión primero debe compilarse desde la fuente:
$ make
gcc -Wall -Werror -bundle -fPIC -Isqlite3 -o okapi_bm25.sqlext okapi_bm25.c
El archivo compilado okapi_bm25.sqlext
se puede cargar como una extensión SQLite. La forma de hacerlo depende del idioma que esté utilizando. Por ejemplo, los enlaces node-sqlite3 tienen una API de extensión especial a la que puede llamar al inicio de su programa. Si está usando SQLite desde la consola, use el comando .load
para cargar la extensión para la sesión actual:
sqlite> .load ./okapi_bm25.sqlext
La función de clasificación utiliza la función matchinfo incorporada para obtener los datos necesarios para calcular las puntuaciones. Una consulta de búsqueda simple podría verse así:
SELECT title FROM documents
WHERE title MATCH <query>
ORDER BY okapi_bm25(matchinfo(documents, 'pcnalx'), 0) DESC
La función matchinfo
debe llamarse con 'pcnalx'
como segundo argumento. Este argumento define la estructura de los datos proporcionados a la función okapi_bm25
, que acepta los datos en una sola forma. Si se llama a la función matchinfo
con un segundo argumento diferente, la extensión puede proporcionar resultados incorrectos o dejar de funcionar por completo.
La función okapi_bm25
solo calcula la puntuación de una columna a la vez. El argumento searchColumn
, proporcionado como 0
en el ejemplo anterior, especifica la columna que utilizará. El número es el índice de la columna dentro de la tabla FTS. Aquí hay un esquema para el ejemplo anterior:
CREATE VIRTUAL TABLE documents USING fts4(title, content);
En este esquema, la columna title
está en el índice 0
porque es la primera columna de la lista. Si se invirtiera el orden, el índice correcto para title
sería 1
.
Los dos últimos argumentos opcionales, k1
y b
, son parámetros libres específicos del algoritmo Okapi BM25. Los valores predeterminados son k1 = 1.2
y b = 0.75
. Puede modificarlos para una optimización avanzada, pero los valores predeterminados probablemente funcionarán bien.
Okapi BM25 para SQLite3 se publica bajo la licencia MIT.