带有 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 节中找到。
我在 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 节中找到。