我有一個 SQLite3 表:
CREATE TABLE "test" (
"title" TEXT,
"shortdesc" TEXT,
"longdesc" TEXT,
"id" TEXT,
PRIMARY KEY("id")
);
我在其中插入任何內容:
INSERT INTO test (id, title, shortdesc, longdesc) VALUES ("abc", "hello world", "this is a hello world", "a nice hello world article about hello worlds")
然后我創建一個 FTS5 虛擬表:
CREATE VIRTUAL TABLE IF NOT EXISTS test_fts USING fts5 (
id,
title,
shortdesc,
longdesc,
content=test
);
所以我檢查虛擬表中的資料:

一切似乎都很好......現在我嘗試使用MATCH查找文章:
SELECT * FROM test_fts WHERE test_fts MATCH 'hello'
......結果我什么也沒得到。顯然,我展示的這個資料庫只是一個例子,實際資料庫也會發生同樣的事情。我在不同的計算機(和不同的客戶端)上嘗試過,我還檢查了 FTS5 是否已啟用并在其中編譯,PRAGMA compile_options并且ENABLE_FTS5在那里,這意味著它已啟用。FTS3 和 4 也會發生同樣的事情。
那么我錯過了什么?SQLite 版本是 3.36.0。
uj5u.com熱心網友回復:
FTS5 表仍然需要填充。這包括外部內容案例。從檔案:
用戶仍有責任確保外部內容 FTS5 表的內容與內容表保持同步。一種方法是使用觸發器。例如:
-- Create a table. And an external content fts5 table to index it. CREATE TABLE tbl(a INTEGER PRIMARY KEY, b, c); CREATE VIRTUAL TABLE fts_idx USING fts5(b, c, content='tbl', content_rowid='a'); -- Triggers to keep the FTS index up to date. CREATE TRIGGER tbl_ai AFTER INSERT ON tbl BEGIN INSERT INTO fts_idx(rowid, b, c) VALUES (new.a, new.b, new.c); END; CREATE TRIGGER tbl_ad AFTER DELETE ON tbl BEGIN INSERT INTO fts_idx(fts_idx, rowid, b, c) VALUES('delete', old.a, old.b, old.c); END; CREATE TRIGGER tbl_au AFTER UPDATE ON tbl BEGIN INSERT INTO fts_idx(fts_idx, rowid, b, c) VALUES('delete', old.a, old.b, old.c); INSERT INTO fts_idx(rowid, b, c) VALUES (new.a, new.b, new.c); END;
因此,您可以在填充主表之前創建表和觸發器,或者在您的測驗用例中,在創建 FTS 表之后,您可以運行這樣的查詢來首次填充 FTS 表:
INSERT INTO test_fts SELECT * FROM test;
然后您的查詢將按預期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/360091.html
