Open10
Goで全文検索
kagome のサンプルを試す
- SQLite の FTS4 を使っている
-
mattn/sqlite3
を使っている
modernc.org/sqlite
を使うようにしてみる。
import
を変更
- _ "github.com/mattn/go-sqlite3"
+ _ "modernc.org/sqlite"
エラーになった
sql: unknown driver "sqlite3" (forgotten import?)
ドライバー名を変更
- db, err := sql.Open("sqlite3", ":memory:")
+ db, err := sql.Open("sqlite", ":memory:")
エラーになった
SQL logic error: no such module: fts4 (1)
FTS5 に変更
if _, err = db.Exec(`
CREATE TABLE IF NOT EXISTS contents_fts(docid INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT);
- CREATE VIRTUAL TABLE IF NOT EXISTS fts USING fts4(words);
+ CREATE VIRTUAL TABLE IF NOT EXISTS fts USING fts5(words);
`); err != nil {
エラーになった
SQL logic error: table fts has no column named docid (1)
この変更は不要だった。docid
を追加。
if _, err = db.Exec(`
CREATE TABLE IF NOT EXISTS contents_fts(docid INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT);
- CREATE VIRTUAL TABLE IF NOT EXISTS fts USING fts4(words);
+ CREATE VIRTUAL TABLE IF NOT EXISTS fts USING fts5(docid, words);
`); err != nil {
無事動いた。
The "docid" alias does not exist. Applications must use "rowid" instead.
とあったので rowid
にしたら動いた。
_, err = db.Exec(
- `INSERT INTO fts(docid, words) VALUES(?, ?)`,
+ `INSERT INTO fts(rowid, words) VALUES(?, ?)`,
rowID,
tokenizedContent,
)
テーブルを作るところはFTS5にするだけで良かった。
if _, err = db.Exec(`
CREATE TABLE IF NOT EXISTS contents_fts(docid INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT);
- CREATE VIRTUAL TABLE IF NOT EXISTS fts USING fts4(words);
+ CREATE VIRTUAL TABLE IF NOT EXISTS fts USING fts5(words);
`); err != nil {
Bleve と kagome のサンプルを試す
サンプルコードがそのまま動いた。