使用没有列名的视图的 SQLite FTS4 外部内容

SQLite FTS4 external content using view without column names

我正在将 FTS4sqlite 3.8.10 一起使用,并且我正在尝试设置这样的架构:

CREATE TABLE Test (name TEXT);
CREATE VIEW TestView as SELECT name FROM Test;
CREATE VIRTUAL TABLE TestFTS using FTS4(content="TestView", name);

在这个玩具示例中,我有一个简单的 table、Test 和一个视图 TestView,它等同于 table。我从视图中创建了一个 FTS4 索引,TestFTS

然后我填充一些数据如下:

INSERT INTO Test VALUES ('bob');
INSERT INTO Test VALUES ('bill');
INSERT INTO Test VALUES ('jane');
INSERT INTO TestFTS(TestFTS) VALUES ('rebuild');

到目前为止一切顺利。现在我想查询我的数据,例如:

SELECT name FROM TestFTS WHERE name MATCH "b*";

这应该 return 两行:

bob

bill

相反,它 return 是一行,并且该行是空白的。如果我查询 TestFTS table 中的所有数据,那么我可以看到这些值,但显然如果我不能执行 MATCH 类型的查询,它就没有多大用处:

SELECT name FROM TestFTS;

bob

bill

jane

知道为什么 SQLite 在对外部内容 VIEW 使用 MATCH 查询时没有 return 数据,甚至没有正确的行数没有列名?

====

更新:我试过将 sqlite 3.13 与命名列视图一起使用,但我遇到了同样的问题。

documentation 说:

When a users query on the FTS table requires a column value other than docid, FTS attempts to read the requested value from the corresponding column of the row in the content table with a rowid value equal to the current FTS docid.

因此视图必须包含一个名为 rowid 的唯一列,该列对应于 FTS table 的 docid

视图需要一个名为 rowid 的列。 ID 不够。 当心:External Content Tables SQLite 网站上的示例具有误导性:

INSERT INTO t3(docid, b, c) SELECT id, b, c FROM t2;

使用和 id 列适用于普通 table,但不适用于视图。您需要改用 rowid:

INSERT INTO t3(docid, b, c) SELECT id rowid, b, c FROM t2;

基于 SQLite 文档示例的 linux 使用 SQLite 3.11 的完整控制台示例。

使用视图不起作用:

$ sqlite3 does_not_work.db;
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
sqlite> CREATE TABLE t2(id INTEGER PRIMARY KEY, a, b, c);
sqlite> CREATE VIEW t2_v AS SELECT id, a, b, c FROM t2;
sqlite> CREATE VIRTUAL TABLE t3 USING fts4(content="t2_v", b, c);
sqlite> INSERT INTO t2 VALUES(2, 'a b', 'c d', 'e f');
sqlite> INSERT INTO t2 VALUES(3, 'g h', 'i j', 'k l');
sqlite> INSERT INTO t3(docid, b, c) SELECT id, b, c FROM t2_v;
sqlite> SELECT * FROM t3 WHERE t3 MATCH 'k';
|
sqlite> .exit

但是在创建视图时为 id 设置列别名 rowid 有效:

sqlite3 works.db;
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
sqlite> CREATE TABLE t2(id INTEGER PRIMARY KEY, a, b, c);
sqlite> CREATE VIEW t2_v AS SELECT id rowid, a, b, c FROM t2;
sqlite> CREATE VIRTUAL TABLE t3 USING fts4(content="t2_v", b, c);
sqlite> INSERT INTO t2 VALUES(2, 'a b', 'c d', 'e f');
sqlite> INSERT INTO t2 VALUES(3, 'g h', 'i j', 'k l');
sqlite> INSERT INTO t3(docid, b, c) SELECT rowid, b, c FROM t2_v;
sqlite> SELECT * FROM t3 WHERE t3 MATCH 'k';
i j|k l
sqlite> 

虽然使用正常的 table 可行:

$ sqlite3 also_works.db;
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
sqlite> CREATE TABLE t2(id INTEGER PRIMARY KEY, a, b, c);
sqlite> CREATE VIRTUAL TABLE t3 USING fts4(content="t2", b, c);
sqlite> INSERT INTO t2 VALUES(2, 'a b', 'c d', 'e f');
sqlite> INSERT INTO t2 VALUES(3, 'g h', 'i j', 'k l');
sqlite> INSERT INTO t3(docid, b, c) SELECT id, b, c FROM t2;
sqlite> SELECT * FROM t3 WHERE t3 MATCH 'k';
i j|k l
sqlite>