【发布时间】:2011-08-15 20:09:45
【问题描述】:
正如标题所说:我们可以使用...USING fts3(tokenizer icu th_TH, ...)。如果可以的话,有谁知道支持哪些语言环境,以及它是否因平台版本而异?
【问题讨论】:
标签: android sqlite locale tokenize full-text-search
正如标题所说:我们可以使用...USING fts3(tokenizer icu th_TH, ...)。如果可以的话,有谁知道支持哪些语言环境,以及它是否因平台版本而异?
【问题讨论】:
标签: android sqlite locale tokenize full-text-search
不,只有 tokenizer=porter
当我指定 tokenizer=icu 时,我得到“android.database.sqlite.SQLiteException: unknown tokenizer: icu”
另外,这个链接暗示如果Android默认没有编译它,它就不会 可用的 http://sqlite.phxsoftware.com/forums/t/2349.aspx
【讨论】:
对于 API 级别 21 或更高版本,我测试并发现 ICU 标记器已经可用。
但是,为了支持 90% 以上的设备,可以进行一些变通。我有一个变通的想法,在我的另一个问题中也提到了这一点:Work around of Android SQLite full-text search for Asian text
您可以将 ICU 标记器功能移植到 java 或原生 Android 模块中,作为一个单独的模块,但不直接参与 SQLite。然后使用“外部内容表”链接到虚拟表(从 FTS4 支持)。
添加元组时,将正常内容添加到外部内容表中,但在添加到虚拟索引表之前调用独立的tokenzier在单词边界添加人工空格。
在进行元组删除时,再次调用tokenzier以人工空格更新内容表,然后删除虚拟表元组,然后删除内容表元组。
这有点棘手,但比较另一种重新编译完整 SQLite 的选项,已经省了很多力气。
关于外部内容表及其工作原理,请参考https://www.sqlite.org/fts3.html#section_6_2_2
可用的 ICU 标记器实际上在 Android SDK 中。使用 BreakIterator.getWordInstance。看起来它甚至支持基于字典的分词器,用于中文等语言。 http://developer.android.com/reference/java/text/BreakIterator.html
【讨论】:
我在下面的链接中有一些使用标记化的 Android 代码,也许它会有所帮助:
【讨论】: