Android上的SQLite是否为FTS启用了ICU标记器?

时间:2011-08-15 20:09:46

标签: android sqlite locale tokenize full-text-search

如标题所示:我们可以使用...USING fts3(tokenizer icu th_TH, ...)。如果可以,是否有人知道哪些语言环境被支持,以及它是否因平台版本而异?

3 个答案:

答案 0 :(得分:4)

不,只有tokenizer = porter

当我指定tokenizer = icu时,我得到“android.database.sqlite.SQLiteException:unknown tokenizer:icu”

此外,此链接暗示如果Android默认情况下没有编译它,它将不会 可得到 http://sqlite.phxsoftware.com/forums/t/2349.aspx

答案 1 :(得分:1)

对于API级别21或以上,我测试过并发现ICU令牌化程序已经可用。

然而,要支持90%以上的设备,可以进行一些解决方法。我有一个解决方法,我的另一个问题也提到了这个想法:How do I run a class in a WAR from the command line?

您可以将ICU tokenizer函数作为单独的模块移植到java或本机Android模块中,但不直接参与SQLite。然后使用"外部内容表"链接到虚拟表(从FTS4支持)。

添加元组时,将正常内容添加到外部内容表,但是在添加到虚拟索引表之前,调用独立的标记符来向单词边界添加人工空间。

当进行元组删除时,再次调用tokenzier以使用人工空间更新内容表,然后删除虚拟表元组,然后删除内容表元组。

这有点棘手,但是比较一个重新编译完整SQLite的另一种选择,它已经少了很多努力。

有关外部内容表及其工作原理,请参阅Work around of Android SQLite full-text search for Asian text

可用的ICU tokenizer实际上存在于Android SDK中。使用BreakIterator.getWordInstance。看起来它甚至支持中文等语言的基于字典的标记化器。 https://www.sqlite.org/fts3.html#section_6_2_2

答案 2 :(得分:0)

我有一些在下面的链接中使用标记化的Android代码,也许会有所帮助:

https://github.com/gast-lib/gast-lib/blob/master/app/src/root/gast/playground/speech/food/db/FtsIndexedFoodDatabase.java