0

我已经按照https://kimsereylam.com/sqlite/2020/03/06/full-text-search-with-sqlite.html设置SQLite 的虚拟表扩展 FTS5以在外部内容表上进行全文搜索。虽然博客展示了如何设置触发器以保持虚拟 FTS 表随数据更新:

CREATE TABLE user (
    id INTEGER PRIMARY KEY,
    username TEXT NOT NULL UNIQUE,
    email TEXT NOT NULL UNIQUE,
    short_description TEXT
)

CREATE VIRTUAL TABLE user_fts USING fts5(
    username, 
    short_description, 
    email UNINDEXED, 
    content='user', 
    content_rowid='id' 
)

CREATE TRIGGER user_ai AFTER INSERT ON user
    BEGIN
        INSERT INTO user_fts (rowid, username, short_description)
        VALUES (new.id, new.username, new.short_description);
    END;
...

我无法以类似的方式从所有以前的数据中填充 FTS 表。我将继续使用博客中的示例:

INSERT INTO user_fts (rowid, username, short_description) SELECT (id, username, short_description) FROM user;

但是,sqlite (3.37.2) 失败并显示row value misused.

请说明id、和是如何相关的content_rowid,以及如何修改查询以正确更新 FTS 表。rowidnew.id

4

1 回答 1

0

INSERT INTO user_fts (rowid, username, short_description) SELECT id, username, short_description FROM user;(无括号)有效。

rowid是唯一的 64 位无符号整数行 ID。如果表包含整数主键(如iduser),它们是相同的(别名)。即user.rowid == user.id = user_fts.rowid。
文档:https ://www.sqlite.org/lang_createtable.html#rowid

new指的是要插入的元素。
文档:https ://www.sqlite.org/lang_createtrigger.html

content_rowid将虚拟 FTS 表链接到外部数据表行 id 列(默认为 rowid)。
文档:https ://www.sqlite.org/fts5.html#external_content_tables

于 2022-01-25T11:34:45.690 回答