Open10

Goで全文検索

yulogyulog

import を変更

- _ "github.com/mattn/go-sqlite3"
+ _ "modernc.org/sqlite"
yulogyulog

エラーになった

sql: unknown driver "sqlite3" (forgotten import?)

ドライバー名を変更

- db, err := sql.Open("sqlite3", ":memory:")
+ db, err := sql.Open("sqlite", ":memory:")
yulogyulog

エラーになった

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 {
yulogyulog

エラーになった

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 {
yulogyulog

https://www.sqlite.org/fts5.html

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 {