11

我在我的应用程序中设置了一个外部内容 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');

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

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

4

1 回答 1

0

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

是的,我把这条线放在每个触发器中

INSERT INTO fts_transactions(fts_transactions) VALUES('rebuild');
于 2020-12-13T12:27:36.887 回答