【问题标题】:How to create virtual table FTS with external sqlite content table?如何使用外部 sqlite 内容表创建虚拟表 FTS?
【发布时间】:2019-08-29 15:50:48
【问题描述】:

我想创建一个包含真实内容的 SQLite 虚拟表。

我有一个小样本可以证明我的问题。我已经红了官方教程,但是在这段代码中找不到任何错误。一些用户使用rebuild 选项,但它对我不起作用。

CREATE TABLE if NOT EXISTS posts (a INTEGER PRIMARY KEY);  
INSERT OR IGNORE INTO posts (a) VALUES(510000);  
INSERT OR IGNORE INTO posts (a) VALUES(510001);  
INSERT OR IGNORE INTO posts (a) VALUES(510300);  
CREATE VIRTUAL TABLE IF NOT EXISTS posts_fts using fts5(content=posts, content_rowid=a, a);  

SELECT * FROM posts_fts where posts_fts MATCH '10' ORDER BY a ASC;

如果我运行它,我会得到:

0 rows returned in 2ms from: SELECT * FROM posts_fts where posts_fts match '10' ORDER BY a ASC;

有人知道我做错了吗?

【问题讨论】:

    标签: sqlite fts4


    【解决方案1】:

    “10”不是 FTS 表中的记号。

    来自the doc

    4.3.1. Unicode61 标记器

    unicode 标记器将所有 unicode 字符分类为 “分隔符”或“标记”字符。默认情况下所有空间和 Unicode 6.1 定义的标点符号被认为是 分隔符,以及所有其他字符作为标记字符。更多的 具体来说,分配给一般类别的所有 unicode 字符 以“L”或“N”(特别是字母和数字)开头或 类别“Co”(“其他,私人使用”)被视为令牌。所有其他 字符是分隔符。

    每个连续运行的一个或多个标记字符都被认为是 成为一个象征。根据规则,分词器不区分大小写 由 Unicode 6.1 定义。

    同样来自the doc

    3.2. FTS5 短语

    FTS 查询由短语组成。短语是一个有序列表 或更多令牌。

    您可以尝试使用“前缀查询”(即MATCH "5*")来查看结果。

    【讨论】:

    • 感谢@DinoCoderSaurus!我试图匹配“前缀”,但它不起作用。您是否尝试使用其他 match 表达式运行此代码?它创建了一个具有真实内容的虚拟表,但您无法匹配任何内容。我还与其他内置标记器一起使用,结果相同。
    • 做完整性检查insert into posts_fts(posts_fts) VALUES ('integrity-check'); 如果返回错误,重建insert into posts_fts(posts_fts) VALUES ('rebuild');。我从 SQLite 命令行(版本 3.17.0)在内存数据库上运行了您的脚本。 validity-check 给了Error: database disk image is malformed。重建后,前缀查询起作用了。
    • 现在它在更新到 SQLite 版本 3.27.2 后可以工作,并且在 rebuild 之后可以工作。为什么会出现这个问题仍然是个谜。
    猜你喜欢
    • 2014-01-28
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2012-08-15
    相关资源
    最近更新 更多