0

我在 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');
4

1 回答 1

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

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

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

有关此表达式语言的更多信息,请参见此处SQLite 文档站点上的 FTS3 和 FTS4 文档的第 3 节。

于 2015-06-30T18:26:21.150 回答