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

Posted

技术标签:

【中文标题】带有 FTS4 表的 sqlite3:查询返回错误的行【英文标题】:sqlite3 with FTS4 table: Query returns wrong row 【发布时间】:2015-06-30 18:12:36 【问题描述】:

我在 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】:
SELECT name FROM test_idx WHERE name MATCH 'lehmbruck-museum';

你传递什么MATCH这里是一个全文查询表达式。该-字符是在是在为@ 987654325一个立场,即表达式语言@集操作的一元运算符,并且肯定是给你你意想不到的效果。值得注意的是 - 你所期望的完全相反!当然,这是找到查询指令准确地找到 - 字符串lehmbruck和NOT museum末 P>

您需要逃避它来得到你想要的结果 - 或者聘请LIKE运算符,如果你正在寻找一个表中的单个列。

在这个表达式语言一些更多的信息可以在上SQLite的文档的网站上的FTS3和FTS4文档的第3节中找到here。

【讨论】:

@ jbaiter检查了一些该网页上这些实施例。注意,它们采用在MATCH整个表而不是像名称的单个列。跨度>

以上是关于带有 FTS4 表的 sqlite3:查询返回错误的行的主要内容,如果未能解决你的问题,请参考以下文章

SQLite3 FTS4、MATCH 和 Android

Android 中的 FTS4 查询错误

SQLite3 INSERT 查询上的随机语法错误

sqlite3多表查询

没有这样的模块:fts4aux-查询使用 fts4aux 创建的 sqlite 虚拟表时出错

需要调整我的 FTS4 SQLite 查询