我有一个使用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',单项搜索工作正常。
为什么在我的复合搜索中对这些字符的处理方式不同?
答案 0 :(得分:2)
默认(simple
)标记生成器读取字母数字字符,并将所有其他字符作为单词分隔符处理。
因此,在搜索邮件ID时,您必须实际搜索包含多个字词的短语(8200
,comms
和io
)。
如果您想将整个邮件ID视为单词,则必须编写custom tokenizer。