带有 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:查询返回错误的行的主要内容,如果未能解决你的问题,请参考以下文章