带有FTS4表的sqlite3:查询返回错误的行

时间:2015-06-30 18:12:37

标签: sql sqlite fts4

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

这是一个更好地说明它的例子:

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');

1 个答案:

答案 0 :(得分:1)

SELECT name FROM test_idx WHERE name MATCH 'lehmbruck-museum';

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

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

有关此表达式语言的更多信息,请参阅SQLite doc站点here上的FTS3和FTS4文档的第3部分。