SQLite FTS5的Match查询返回空值

3

我有一个SQLite3表:

CREATE TABLE "test" (
    "title" TEXT,
    "shortdesc" TEXT,
    "longdesc"  TEXT,
    "id"    TEXT,
    PRIMARY KEY("id")
);

我可以在其中插入任何内容:

INSERT INTO test (id, title, shortdesc, longdesc) VALUES ("abc", "hello world", "this is a hello world", "a nice hello world article about hello worlds")

接下来我创建了一个FTS5虚拟表:

CREATE VIRTUAL TABLE IF NOT EXISTS test_fts USING fts5 (
        id,
        title,
        shortdesc,
        longdesc,
        content=test
);

所以我在虚拟表格中检查数据:

screenshot

一切看起来都很好...... 现在我尝试使用MATCH来查找文章:

SELECT * FROM test_fts WHERE test_fts MATCH 'hello'

...然而我没有得到结果。显然,我展示的数据库只是一个例子,实际数据库也出现了同样的问题。我在不同的计算机上尝试过(以及在不同的客户端上),我还检查了FTS5是否启用,并使用 PRAGMA compile_options ENABLE_FTS5 进行了编译,意味着它已经启用了。同样的问题也发生在FTS3和4。

那么我错过了什么?SQLite版本为3.36.0。

1个回答

6

FTS5表仍需要进行填充,包括外部内容案例。从文档中了解到:

It is still the responsibility of the user to ensure that the contents of an external content FTS5 table are kept up to date with the content table. One way to do this is with triggers. For example:

-- Create a table. And an external content fts5 table to index it.
CREATE TABLE tbl(a INTEGER PRIMARY KEY, b, c);
CREATE VIRTUAL TABLE fts_idx USING fts5(b, c, content='tbl', content_rowid='a');

-- Triggers to keep the FTS index up to date.
CREATE TRIGGER tbl_ai AFTER INSERT ON tbl BEGIN
 INSERT INTO fts_idx(rowid, b, c) VALUES (new.a, new.b, new.c);
END;
CREATE TRIGGER tbl_ad AFTER DELETE ON tbl BEGIN
 INSERT INTO fts_idx(fts_idx, rowid, b, c) VALUES('delete', old.a, old.b, old.c);
END;
CREATE TRIGGER tbl_au AFTER UPDATE ON tbl BEGIN
 INSERT INTO fts_idx(fts_idx, rowid, b, c) VALUES('delete', old.a, old.b, old.c);
 INSERT INTO fts_idx(rowid, b, c) VALUES (new.a, new.b, new.c);
END;

所以,您可以在填充主表之前创建表格和触发器,或者在测试用例中,在创建FTS表之后运行像这样的查询,首次填充FTS表:

INSERT INTO test_fts SELECT * FROM test;

那么您的查询将按预期工作。


2
谢谢,那个有效。但我不明白的是,为什么当我通过 SELECT * FROM test_fts 查询所有内容时,即使我没有填充数据,它也会返回所有内容。 - ifbamoq
2
@ifbamoq 看起来当你创建主表时,它会自动填充主表,但不会填充一些辅助表,比如 *_data 表,这些表是它实际上需要查找的。然后当你执行 INSERT 操作时,它会填充这些表(即使实际上没有将新条目插入到你要插入的表中)。如果这不是一个 bug 的话,那么这个默认行为真的很奇怪(而且据我所知,也没有记录在案)。 - Soren Bjornstad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接