是否需要手动填充 SQLite FTS 表?
Do SQLite FTS tables need to be manually populated?
SQLite FTS 的文档implies 应该使用 INSERT、UPDATE、DELETE 等填充和更新 FTS table
这就是我所做的 - 添加行、删除它们等,但最近我注意到,一旦我创建 FTS table,它就会使用源中的数据自动填充.我是这样创建的:
CREATE VIRTUAL TABLE notes_fts USING fts4(content="notes", notindexed="id", id, title, body)
如果我向 "notes" table 添加一行,它也会自动添加到 notes_fts。我想这就是虚拟 table 的含义。
但是,为什么有一章是关于填充 FTS tables 的?甚至有什么意义,因为例如,如果我删除一行,如果它仍在源中,它会回来 table.
对此有什么想法吗? FTS 真的需要填充吗?
进一步阅读后,我发现 FTS table 确实需要手动与内容 table 保持同步。当 运行 CREATE VIRTUAL TABLE
调用时,FTS table 会自动填充,但之后必须手动完成删除、插入和更新。
就我而言,我是使用以下触发器完成的:
CREATE VIRTUAL TABLE notes_fts USING fts4(content="notes", notindexed="id", id, title, body
CREATE TRIGGER notes_fts_before_update BEFORE UPDATE ON notes BEGIN
DELETE FROM notes_fts WHERE docid=old.rowid;
END
CREATE TRIGGER notes_fts_before_delete BEFORE DELETE ON notes BEGIN
DELETE FROM notes_fts WHERE docid=old.rowid;
END
CREATE TRIGGER notes_after_update AFTER UPDATE ON notes BEGIN
INSERT INTO notes_fts(docid, id, title, body) SELECT rowid, id, title, body FROM notes WHERE is_conflict = 0 AND encryption_applied = 0 AND new.rowid = notes.rowid;
END
CREATE TRIGGER notes_after_insert AFTER INSERT ON notes BEGIN
INSERT INTO notes_fts(docid, id, title, body) SELECT rowid, id, title, body FROM notes WHERE is_conflict = 0 AND encryption_applied = 0 AND new.rowid = notes.rowid;
END;
要删除条目,
-- Insert a row with rowid=14 into the fts5 table.
INSERT INTO ft(rowid, a, b, c) VALUES(14, $a, $b, $c);
-- Remove the same row from the fts5 table.
INSERT INTO ft(ft, rowid, a, b, c) VALUES('delete', 14, $a, $b, $c);
或
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;
根据修改后的虚拟重建table
INSERT INTO ft(ft) VALUES('rebuild');
SQLite FTS 的文档implies 应该使用 INSERT、UPDATE、DELETE 等填充和更新 FTS table
这就是我所做的 - 添加行、删除它们等,但最近我注意到,一旦我创建 FTS table,它就会使用源中的数据自动填充.我是这样创建的:
CREATE VIRTUAL TABLE notes_fts USING fts4(content="notes", notindexed="id", id, title, body)
如果我向 "notes" table 添加一行,它也会自动添加到 notes_fts。我想这就是虚拟 table 的含义。
但是,为什么有一章是关于填充 FTS tables 的?甚至有什么意义,因为例如,如果我删除一行,如果它仍在源中,它会回来 table.
对此有什么想法吗? FTS 真的需要填充吗?
进一步阅读后,我发现 FTS table 确实需要手动与内容 table 保持同步。当 运行 CREATE VIRTUAL TABLE
调用时,FTS table 会自动填充,但之后必须手动完成删除、插入和更新。
就我而言,我是使用以下触发器完成的:
CREATE VIRTUAL TABLE notes_fts USING fts4(content="notes", notindexed="id", id, title, body
CREATE TRIGGER notes_fts_before_update BEFORE UPDATE ON notes BEGIN
DELETE FROM notes_fts WHERE docid=old.rowid;
END
CREATE TRIGGER notes_fts_before_delete BEFORE DELETE ON notes BEGIN
DELETE FROM notes_fts WHERE docid=old.rowid;
END
CREATE TRIGGER notes_after_update AFTER UPDATE ON notes BEGIN
INSERT INTO notes_fts(docid, id, title, body) SELECT rowid, id, title, body FROM notes WHERE is_conflict = 0 AND encryption_applied = 0 AND new.rowid = notes.rowid;
END
CREATE TRIGGER notes_after_insert AFTER INSERT ON notes BEGIN
INSERT INTO notes_fts(docid, id, title, body) SELECT rowid, id, title, body FROM notes WHERE is_conflict = 0 AND encryption_applied = 0 AND new.rowid = notes.rowid;
END;
要删除条目,
-- Insert a row with rowid=14 into the fts5 table.
INSERT INTO ft(rowid, a, b, c) VALUES(14, $a, $b, $c);
-- Remove the same row from the fts5 table.
INSERT INTO ft(ft, rowid, a, b, c) VALUES('delete', 14, $a, $b, $c);
或
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;
根据修改后的虚拟重建table
INSERT INTO ft(ft) VALUES('rebuild');