从内容表填充虚拟SQLite FTS5(全文搜索)表

9rnv2umw  于 2023-01-26  发布在  SQLite
关注(0)|答案(1)|浏览(192)

我已经按照https://kimsereylam.com/sqlite/2020/03/06/full-text-search-with-sqlite.html设置了SQLite's virtual table extension 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上失败了。
请解释idcontent_rowidrowidnew.id之间的关系,以及如何修改查询以正确更新FTS表。

yi0zb3m4

yi0zb3m41#

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

(no括号)起作用。
rowid是唯一的64位无符号整数行ID。如果表包含整数主键(如user中的id),则它们相同(别名)。即user. rowid == www.example.com = user_fts. rowid。user.id = user_fts.rowid.
文件:www.example.comhttps://www.sqlite.org/lang_createtable.html#rowid
new表示要插入的元素。
文件:https://www.sqlite.org/lang_createtrigger.html
content_rowid将虚拟FTS表链接到外部数据表行id列(默认为rowid)。
文件:www.example.comhttps://www.sqlite.org/fts5.html#external_content_tables

相关问题