我读过很多帖子询问Android中是否可以进行基于SQLite的全文搜索,所有答案都指出Android内置的SQLite不允许自定义分词器。默认分词器会考虑用空格或其他符号分隔的单词,但亚洲单词(如中文)需要其特殊的分词器,但 Android 不允许添加自定义分词器。
我读过的帖子是几年前的了。最近的 Android 版本有更新吗?我刚刚搜索了一下,没有找到答案。
我正在考虑解决方法。在我将元组 INSERT 到 FTS3/FTS4 虚拟表进行索引之前,我人为地在每个单词之间添加空格,以便默认分词器可以将每个亚洲“单词”视为英语单词,这是否可行? 进行查询时,查询字符串也会做同样的事情,也添加了人工空格。
我在Linux下尝试过,看起来可以。例如,如果我这样做,那么亚洲文本的全文搜索就可以了:
CREATE VIRTUAL TABLE mail USING fts3(subject, body);
INSERT INTO mail(docid, subject, body) VALUES(4, 'software feedback', '这 个 Bug 还 没 有 解 决');
SELECT * FROM mail WHERE body MATCH '没 有 解 决';
但有一个疑问是,由于有双倍的字符和空格,数据库文件是否会花费更多的存储空间。看起来所谓的“虚拟表”不仅存储生成的索引,还存储原始文本。
对于 API Level 21 或更高版本,我测试发现 ICU tokenizer 已经可用。
对于旧设备,我在另一个问题中找到了解决方案: Android 上的 SQLite 是否使用支持 FTS 的 ICU 标记生成器构建?
有更新吗?我在使用 sqlite 的中文 fts 中遇到同样的问题
使用 NDK 编译您自己的 SQLite 副本,然后您可以使用它做任何您想做的事情。