gpt4 book ai didi

带连字符的 SQLite 全文搜索查询

转载 作者:IT王子 更新时间:2023-10-29 06:31:54 26 4
gpt4 key购买 nike

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

我的问题: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 之前用“+”或空格替换“-”,但这并不是真正正确的解决方案。

最佳答案

我在文档中找到:

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"';

关于带连字符的 SQLite 全文搜索查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21596069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com