SQLite全文索引fts4和fts5支持contentless和content表,這兩個表結構的區(qū)別就是contentless只有索引,不存儲原文,所以數據庫不會增加很大,缺點是源表修改后,contentless表無法更新。conentless表建立語句如下:
CREATE VIRTUAL TABLE f1 USING fts5(a, b, c, content='');
字段a,b,c是要全文索引的字段,建立以后要執(zhí)行初始化插入數據:
INSERT INTO t1(rowid, a, b, c) VALUES(1, 'a b c', 'd e f', 'g h i');
注意fts4有docid字段,fts5已經沒有了,而是用rowid代替。
fts5 content表建表語句:
源表 CREATE TABLE tbl (a, b, c, d INTEGER PRIMARY KEY);
fts5表 CREATE VIRTUAL TABLE fts USING fts5(a, c, content=tbl, content_rowid=d);
fts5建表語句就直接初始化數據了,但是content表會增加數據庫文件將近一倍的大小。
如果要保持content表跟源表同步變化,必須使用觸發(fā)器trigger來實現:
-- 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;