1

我想创建一个包含真实内容的 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;

有人知道我做错了吗?

4

1 回答 1

0

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

文档

4.3.1。Unicode61 分词器

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

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

同样来自文档

3.2. FTS5 短语

FTS 查询由短语组成。短语是一个或多个标记的有序列表。

您可以尝试“前缀查询”,即MATCH "5*"查看您得到的结果。

于 2019-04-08T15:48:39.327 回答