带有 FTS4 table 的 sqlite3:查询 returns 错误行

sqlite3 with FTS4 table: Query returns wrong row

我在 SQLite3 中的 FTS4 索引有一个奇怪的问题,即 MATCH 查询一个术语 returns 不是完全匹配而是另一个,相似的,反之亦然。

这里有一个例子可以更好地说明它:

SELECT name FROM test_idx WHERE name MATCH 'lehmbruck-museum';
-- "Lehmbruck-Archiv"
SELECT name FROM test_idx WHERE name MATCH 'lehmbruck-archiv';
-- "Lehmbruck-Museum"

这似乎与破折号有关,这是一个表现出相同行为的类似案例:

SELECT name FROM test_idx WHERE name MATCH 'some-thing';
-- "some-thang"
SELECT name FROM test_idx WHERE name MATCH 'some-thang';
-- "some-thing"

下面是这个测试数据库的构建方式,以防有人想尝试复制它:

CREATE VIRTUAL TABLE test_idx USING fts4(name);
INSERT INTO test_idx (name) VALUES
    ('some-thing'), ('some-thang'),
    ('Lehmbruck-Museum'), ('Lehmbruck-Archiv');
SELECT name FROM test_idx WHERE name MATCH 'lehmbruck-museum';

这里传给MATCH的是全文查询表达式。 - 字符是该表达式语言中的一元运算符,代表 NOT 集合运算,肯定会给您带来意想不到的结果。值得注意的是 - 与您的期望完全相反!当然,它准确地找到了查询指示要查找的内容 - 字符串 lehmbruck 而不是末尾的 museum

您需要对其进行转义以获得您想要的结果 - 或者如果您正在查看 table 中的单个列,则可能使用 LIKE 运算符。

有关此表达式语言的更多信息可以在 SQLite 文档站点 here 上的 FTS3 和 FTS4 文档的第 3 节中找到。