【问题标题】:Is SQLite on Android built with the ICU tokenizer enabled for FTS?Android 上的 SQLite 是否使用为 FTS 启用的 ICU 标记器构建?
【发布时间】:2011-08-15 20:09:45
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    不,只有 tokenizer=porter

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

    另外,这个链接暗示如果Android默认没有编译它,它就不会 可用的 http://sqlite.phxsoftware.com/forums/t/2349.aspx

    【讨论】:

    • 谢谢。这证实了我的猜想。太糟糕了。 :(
    • 我在两年多前报告了这个问题code.google.com/p/android/issues/detail?id=9199,但谷歌一直在优先考虑动态壁纸,包括触摸波、关机动画、不安全的解锁方法(面部解锁)......而不是这样的问题。
    • @gregm,链接失效了。
    • Eduardo 发布的链接表明 ICU 在 Android 21 (Lollipop) 中可用。
    【解决方案2】:

    对于 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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-05
        • 2011-03-05
        • 1970-01-01
        • 2014-08-16
        • 2015-07-11
        • 2018-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多