Android 安卓SQLite全文搜索亚洲文本的解决方案
我读过很多帖子,询问基于SQLite的全文搜索是否可以在Android中完成,所有的答案都指出Android的内置SQLite不允许自定义标记器。默认标记器考虑用空格或其他符号分隔的单词,但亚洲单词(如汉语)需要其特殊的标记器,但Android不允许添加自定义标记器 我读的帖子是几年前写的。最近的安卓版本有更新吗?我只是搜索了一下,没有找到答案 我在想一个解决办法。在将元组插入到FTS3/FTS4虚拟表中进行索引之前,我是否人为地在每个单词之间添加空格,这样默认的记录器可以把每个亚洲“单词”看作一个英语单词,这是可行的吗?在执行查询时,查询字符串也会执行相同的操作,即添加人工空格 我在Linux上试过,看起来很管用。例如,如果我喜欢这样做,则全文搜索适用于亚洲文本:Android 安卓SQLite全文搜索亚洲文本的解决方案,android,sqlite,full-text-search,fts3,fts4,Android,Sqlite,Full Text Search,Fts3,Fts4,我读过很多帖子,询问基于SQLite的全文搜索是否可以在Android中完成,所有的答案都指出Android的内置SQLite不允许自定义标记器。默认标记器考虑用空格或其他符号分隔的单词,但亚洲单词(如汉语)需要其特殊的标记器,但Android不允许添加自定义标记器 我读的帖子是几年前写的。最近的安卓版本有更新吗?我只是搜索了一下,没有找到答案 我在想一个解决办法。在将元组插入到FTS3/FTS4虚拟表中进行索引之前,我是否人为地在每个单词之间添加空格,这样默认的记录器可以把每个亚洲“单词”看作
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 '没 有 解 决';
但有一个疑问是,它是否会为数据库文件花费更多的存储空间,因为有两倍的字符和空格。看起来所谓的“虚拟表”不仅存储生成的索引,还存储原始文本。使用NDK编译您自己的SQLite副本,然后您可以使用它做任何您想做的事情。对于API级别21或更高的版本,我测试并发现ICU标记器已经可用。 对于较旧的设备,我在另一个问题中找到了解决方案:
如果您以前从未使用过NDK,那么这当然会很困难。我刚刚发现FTS4具有名为“无内容FTS4表”和“外部内容FTS4表”的功能。无内容表只存储索引而不存储内容,外部内容表可以独立于虚拟表存储内容。因此,我认为我可以在虚拟表中插入带有人工空格的文本,并将精确的文本存储在外部内容表中。这听起来是一个很好的解决方案。。。。