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

时间:2014-01-09 16:43:44

标签: ios sql sqlite full-text-search 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;

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

INSERT INTO fts_transactions(fts_transactions) VALUES('rebuild');

它是如何工作的?我原以为在FTS表中插入/更新/删除会修改索引,而不是每次都要求我重建它。重建后,新条目显示正常。

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

1 个答案:

答案 0 :(得分:0)

这是应该如何工作的吗?

是的,我在每一个Triger中都添加了这一行

INSERT INTO fts_transactions(fts_transactions) VALUES('rebuild');