SQLite на Android построен с включенным токенайзером ICU для FTS? - PullRequest
7 голосов
/ 16 августа 2011

Как видно из названия: можем ли мы использовать ...USING fts3(tokenizer icu th_TH, ...). Если мы можем, кто-нибудь знает, какие локали поддерживаются, и зависит ли это от версии платформы?

Ответы [ 3 ]

4 голосов
/ 18 ноября 2011

Нет, только tokenizer = porter

Когда я указываю tokenizer = icu, я получаю "android.database.sqlite.SQLiteException: unknown tokenizer: icu"

Кроме того, эта ссылка указывает на то, чтоесли Android не скомпилировал его по умолчанию, он не будет доступен http://sqlite.phxsoftware.com/forums/t/2349.aspx

1 голос
/ 21 октября 2015

Для API уровня 21 или выше, я проверил и обнаружил, что токенизатор ICU уже доступен.

Однако для поддержки более 90% устройств можно обойтись. У меня есть идея обхода, которая также упоминается в моем другом вопросе: Обход Android полнотекстового поиска SQLite для азиатского текста

Вы можете портировать функцию токенайзера ICU в java или собственный модуль Android как отдельный модуль, но напрямую не участвующий в SQLite. Затем используйте «таблицу внешнего содержимого» для связи с виртуальной таблицей (поддерживается FTS4).

При добавлении кортежа добавьте нормальное содержимое во внешнюю таблицу содержимого, но вызовите автономный токензер, чтобы добавить искусственные пробелы к границе слов перед добавлением в таблицу виртуального индекса.

При удалении кортежа снова вызовите 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

0 голосов
/ 17 апреля 2015

У меня есть некоторый код Android, который использует токенизацию по ссылке ниже, возможно, это поможет:

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

...