为什么SQLite全文搜索(FTS4)在复合搜索中对尖括号的处理方式不同?

时间:2012-12-28 06:37:57

标签: sqlite full-text-search fts3 fts4

我有一个使用FTS4的SQLite数据库。它用于存储消息ID为以下形式的电子邮件:

使用FTS MATCH语法搜索消息,我得到以下结果:

SELECT rowid FROM emails WHERE emails MATCH '<8200@comms.io>'

返回正确的行。但是当我试图找到多封电子邮件时,我得到一个空洞的回复:

SELECT rowid FROM emails WHERE emails MATCH '<8200@comms.io> OR <8188@comms.io>'

奇怪的是,我可以搜索没有尖括号的字符。这将返回两行:

SELECT rowid FROM emails WHERE emails MATCH '8200@comms.io OR 8188@comms.io'

即使存储列中存在尖括号,也是如此。我没有提到这些是SQLite中的特殊字符,没有'OR',单项搜索工作正常。

为什么在我的复合搜索中对这些字符的处理方式不同?

1 个答案:

答案 0 :(得分:2)

默认(simple)标记生成器读取字母数字字符,并将所有其他字符作为单词分隔符处理。 因此,在搜索邮件ID时,您必须实际搜索包含多个字词的短语(8200commsio)。

如果您想将整个邮件ID视为单词,则必须编写custom tokenizer