Re: [问题] QT Sqlite语法以及全文检索FTS问题

楼主: pinefruit (莫使惹尘埃)   2021-11-19 20:44:12
※ 引述《liu2007 (薯)》之铭言:
: 我的开发平台是 win7
: 工具是QT Creator
: 版本是Qt Core 5.15.2
: 在写一些存取Sqlite数据库的程式碰到了两个问题。
: 1.当要查询的字当中包含sql语法保留字的时候:
: QString keyword;
: QString queryString{"SELECT * FROM exfts WHERE nameEN match ?"};
: query.prepare(queryString);
: query.addBindValue(keyword);
: 当keyword是sql语法的保留字,例如:AND, OR等等,querry会失败
: 想请问QT有相对应函式可以解决吗?
: 还是只能自己判断如果要搜的关键字是保留字的时候
: querryString要自己变成
: QString queryString{"SELECT * FROM exfts WHERE nameEN match " +
: "'"+ keyword +"';"};
还是可以继续用 addBindValue(),只要帮该关键字加上引号即可。
例如:addBindValue("'OR'") 或 addBindValue("\"OR\"")
: 2.第二个问题就是在使用全文检索FTS的时候
: match + 万用字符* 跟
: 一般普通的sql语法 like + 万用字符%
: 两者似乎有什么不一样
: 如果我想要找有包含“水果”两个字的字段
: 使用 like '%水果%'搜寻
: 那不管是
: 1.好吃的水果
: 2.好吃 水果真的很好吃
: 3.好吃 水果 真的很好吃
: 3.好吃-水果-真的很好吃
: 都可以捞出来
: 但如果是match '水果'
: 只有3会被捞出来
: 如果使用match '*水果*'
: 有时候可以被捞出来
: 也有可能不会被捞出来
: 因为这是之前碰到的问题现在才来问
: 所以当时的数据库资料以及下的关键字我一时举例不上来
: 我下班之后如果有找到例子会再补上
: 目前只确定使用match '关键字'的时候
: 两旁有用空白切开来的字段才会被捞出来,例如上述的3
: 其他包含在一句没断开的句子里则不会捞出来
: 用万用字符摆前或摆后也没有正确捞出
: 想请问是我完全搞错FTS的万用字符*的用法
: 还是是因为非英语的文字分割字词的关系?
: 又或是其他原因呢?
: 感谢阅读
先简单回答,
MATCH 做的是 token query,而 LIKE 做的则是 pattern matching。
详细一点解释的话,
MATCH 比较的是字串中的 token,
而只有前后是空白或特殊字符的部分才会被归类成 token。
例如在以下三个例子中,term 都会是 token:
"a short term", "long-term", "a_legal_term"
但如果是 "terminology" 的话,term 就不是一个 token 了,
因此用 MATCH 'term' 是找不到它的。
另外,使用万用字符 * 的 MATCH,称为 token prefix query,
它一样只会拿来和 token 做比较,且只会比较该 token 的前缀部分(prefix)。
例如使用 MATCH 'ter*' 的话,上面四个例子都会被找到,
但如果使用 MATCH '*erm' 则不会有任何匹配。
至于 LIKE 比较的则是整个字串,而非其中的 token,
也就是说,整个字串都必须符合 LIKE 后面写的 pattern,才算满足条件。
两者的差异大概是这样子,有错误的地方再烦请指正。
作者: liu2007 (è–¯)   2021-11-19 21:58:00
我在上班有偷偷查资料,关于万用字符*的部分也是查到说只能match开头的资料,从另外一个角度来说,像fts这种建索引的方式的数据库,要它去找match结尾等于是要把整个资料翻一遍,就违背建索引的目的了XD至于第一个问题我query用问号然后再去addbindvalue的原因就是我的资料除了有可能AND等保留字以外,还会有'和"这种这种符号,如果bind上去之前都要检查是否包含'或"免得query下错,看起来有点多此一举又莫可奈何,所以才会想用问号的方式,但没想到现在?没办法解决保留字的问题...感谢回答

Links booklink

Contact Us: admin [ a t ] ucptt.com