SQLite全文搜索查询与连字符

时间:2014-02-06 06:55:30

标签: sql sqlite full-text-search

我一直在使用SQLite(3)来建立一个小网站。最近,我发现了SQLite的全文搜索(FTS)功能,并将其用于简单的搜索功能。但是,用户无意中发现搜索字符串中的连字符(' - ')表示错误。它似乎表明应该排除紧随其后的令牌。实际上,当我将连字符更改为加号或空格时,它确实有效。

我的问题:1)我在此分析中是否正确?我阅读SQLite documentation regarding the FTS feature并未找到有关此问题的讨论。 2)我应该如何缓解这种情况?在将连字符传递给SQLite之前手动替换连字符?

我所看到的一个小而具体的例子:

sqlite> CREATE VIRTUAL TABLE fts_table USING fts4
   ...> ( content TEXT );

sqlite> INSERT INTO fts_table VALUES ("Title: F-1 Race (Game Boy)");
sqlite> INSERT INTO fts_table VALUES ("Title: F-Zero (SNES)");
sqlite> INSERT INTO fts_table VALUES ("Title: F-15 Strike Eagle II (Genesis)");

sqlite> SELECT * FROM fts_table;
Title: F-1 Race (Game Boy)
Title: F-Zero (SNES)
Title: F-15 Strike Eagle II (Genesis)

(此数据库与旧视频游戏有关,您可能已经猜到了。)

因此,网站从用户处获取搜索字符串,并使用MATCH运算符将其插入SELECT语句。对于搜索字符串'f-zero',相关的SQL变为:

sqlite> SELECT * FROM fts_table WHERE content MATCH 'f-zero';
Title: F-1 Race (Game Boy)
Title: F-15 Strike Eagle II (Genesis)

即,它与标题'F-Zero'不匹配。但是,字符串'f + zero'返回正确的内容:

sqlite> SELECT * FROM fts_table WHERE content MATCH 'f+zero';
Title: F-Zero (SNES)

同样,我想在将字符串发送到SQLite之前我可以用'+'或空格替换' - ',但这并不是真正的解决方案。

1 个答案:

答案 0 :(得分:8)

我在文档中找到了:

The NOT operator (or, if using the standard syntax, a unary "-" operator)

所以它们是相同的,例如:

-- Query for all documents that contain the term "database", but do not contain
-- the term "sqlite". Document 1 is the only document that matches this criteria.
SELECT * FROM docs WHERE docs MATCH 'database NOT sqlite';

这与:

相同
SELECT * FROM docs WHERE docs MATCH 'database -sqlite';

在您的情况下,您必须使用短语查询,如下所示:

SELECT * FROM fts_table WHERE content MATCH '"f-zero"';