我在我的应用程序中设置了一个外部内容FTS4虚拟表,以允许对现有数据库进行全文搜索。我还设置了类似于文档的触发器,因此当我的主要内容表更新时,FTS表也会获得新条目。
CREATE TRIGGER t2_bu BEFORE UPDATE ON t2 BEGIN
DELETE FROM t3 WHERE docid=old.rowid;
END;
CREATE TRIGGER t2_bd BEFORE DELETE ON t2 BEGIN
DELETE FROM t3 WHERE docid=old.rowid;
END;
CREATE TRIGGER t2_au AFTER UPDATE ON t2 BEGIN
INSERT INTO t3(docid, b, c) VALUES(new.rowid, new.b, new.c);
END;
CREATE TRIGGER t2_ai AFTER INSERT ON t2 BEGIN
INSERT INTO t3(docid, b, c) VALUES(new.rowid, new.b, new.c);
END;
问题在于触发器似乎没有实际更新索引。我从fts_transactions表中做了一个简单的select *,我可以看到具有正确文本和rowid的新条目,但是在实际搜索时它们不会出现。要让它们显示出来,我必须像这样进行完整的重建:
INSERT INTO fts_transactions(fts_transactions) VALUES('rebuild');
这是它应该工作的方式吗?我原本想插入/更新/删除全文搜索表将修改索引而不需要每次重建它。在重建后,新条目显示得很好。
如果是这样的话,那么只需将重建命令添加到触发器中是否可以?我只是担心在旧设备上重建具有数千个条目的索引时,添加新项目会变得很慢...似乎应该有更好的方法。