Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓SQLite全文搜索亚洲文本的解决方案_Android_Sqlite_Full Text Search_Fts3_Fts4 - Fatal编程技术网

Android 安卓SQLite全文搜索亚洲文本的解决方案

Android 安卓SQLite全文搜索亚洲文本的解决方案,android,sqlite,full-text-search,fts3,fts4,Android,Sqlite,Full Text Search,Fts3,Fts4,我读过很多帖子,询问基于SQLite的全文搜索是否可以在Android中完成,所有的答案都指出Android的内置SQLite不允许自定义标记器。默认标记器考虑用空格或其他符号分隔的单词,但亚洲单词(如汉语)需要其特殊的标记器,但Android不允许添加自定义标记器 我读的帖子是几年前写的。最近的安卓版本有更新吗?我只是搜索了一下,没有找到答案 我在想一个解决办法。在将元组插入到FTS3/FTS4虚拟表中进行索引之前,我是否人为地在每个单词之间添加空格,这样默认的记录器可以把每个亚洲“单词”看作

我读过很多帖子,询问基于SQLite的全文搜索是否可以在Android中完成,所有的答案都指出Android的内置SQLite不允许自定义标记器。默认标记器考虑用空格或其他符号分隔的单词,但亚洲单词(如汉语)需要其特殊的标记器,但Android不允许添加自定义标记器

我读的帖子是几年前写的。最近的安卓版本有更新吗?我只是搜索了一下,没有找到答案

我在想一个解决办法。在将元组插入到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 '没 有 解 决';  

但有一个疑问是,它是否会为数据库文件花费更多的存储空间,因为有两倍的字符和空格。看起来所谓的“虚拟表”不仅存储生成的索引,还存储原始文本。

使用NDK编译您自己的SQLite副本,然后您可以使用它做任何您想做的事情。

对于API级别21或更高的版本,我测试并发现ICU标记器已经可用。

对于较旧的设备,我在另一个问题中找到了解决方案:

如果您以前从未使用过NDK,那么这当然会很困难。我刚刚发现FTS4具有名为“无内容FTS4表”和“外部内容FTS4表”的功能。无内容表只存储索引而不存储内容,外部内容表可以独立于虚拟表存储内容。因此,我认为我可以在虚拟表中插入带有人工空格的文本,并将精确的文本存储在外部内容表中。这听起来是一个很好的解决方案。。。。