SQLite外部内容FTS每次都需要重建吗?

Jas*_*rdy 5 sql sqlite full-text-search ios fts4

我在应用程序中设置了一个外部内容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;
Run Code Online (Sandbox Code Playgroud)

问题在于触发器似乎并没有真正更新索引。我从fts_transactions表中做了一个简单的select *,我看到了带有正确文本和rowid的新条目,但是在实际搜索时它们不会出现。为了使它们显示出来,我必须像这样进行完全重建:

INSERT INTO fts_transactions(fts_transactions) VALUES('rebuild');
Run Code Online (Sandbox Code Playgroud)

这是应该如何工作的吗?我本以为插入到FTS表中的插入/更新/删除将修改索引,而不需要我每次都重建它。重建后,新条目会很好显示。

如果是这种情况,那么可以只将rebuild命令添加到触发器中吗?我只是担心,一旦必须在旧设备上用几千个条目重建索引,添加新项就会变慢……似乎应该有更好的方法。

Jac*_*k J 1

这是它应该如何工作的吗?

是的,我把这一行放在每个触发器中

INSERT INTO fts_transactions(fts_transactions) VALUES('rebuild');
Run Code Online (Sandbox Code Playgroud)