我在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');
答案 0 :(得分:1)
SELECT name FROM test_idx WHERE name MATCH 'lehmbruck-museum';
这里传递给MATCH
的是全文查询表达式。 -
字符是该表达式语言中的一元运算符,它是NOT
集合操作的代表,并且肯定会给您带来意想不到的结果。值得注意的是 - 与您的期望完全相反!当然,它正在找到指示查询的确切内容 - 最后是字符串lehmbruck
而不是museum
!
您需要将其转义以获得所需的结果 - 或者如果您正在查看表中的单个列,则可能使用LIKE
运算符。
有关此表达式语言的更多信息,请参阅SQLite doc站点here上的FTS3和FTS4文档的第3部分。