是否需要手动填充 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;

根据sqlite document

要删除条目,

-- 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');