использование sqlite (с FTS) на Android - PullRequest
2 голосов
/ 13 декабря 2010

Я использую базу данных sqlite FTS3 со своим приложением для Android.

   public Cursor getWordMatches(String query, String[] columns) {
        String selection = KEY_WORD + " MATCH ?";
        String[] selectionArgs = new String[] {query+"*"};
        return query(selection, selectionArgs, columns);
   }

.....

private Cursor query(String selection, String[] selectionArgs, String[] columns) {
    SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
    builder.setTables(FTS_VIRTUAL_TABLE);
    builder.setProjectionMap(mColumnMap);     

    Cursor cursor = builder.query(mDatabaseOpenHelper.getReadableDatabase(),
            columns, selection, selectionArgs, null, null, null);

    if (cursor == null) {
        return null;
    } else if (!cursor.moveToFirst()) {
        cursor.close();
        return null;
    }
    return cursor;
}

Если я сделаю запрос и произведу поиск 'house', я получу:

household 
house 
apartment house 
big house

(я получаю все, что содержит дом, в регулярном выражении дом )

Как я могу получить такой результат для моего запроса?

household
house

(поэтому я хочу только результаты, начинающиеся с house, в regex house *)

Мое приложение для Android FORCE ЗАКРЫВАЕТСЯ, если я использую оператор LIKE (возможно, из-за того, что в db 200000 строк) Так должен ли я как-то сочетать операторы MATCH и LIKE? Возможно ли это сделать на Android, если нет, то мне следует попытаться запустить какое-нибудь регулярное выражение для курсора после того, как я получу его из этого запроса?

1 Ответ

0 голосов
/ 17 июня 2011

Таблицы полнотекстового поиска всегда должны использовать MATCH, а не LIKE, потому что запрос LIKE выполняет полное сканирование таблицы, что в первую очередь сводит на нет цель создания таблицы FTS.попробуйте использовать токенайзер, отличный от стандартного, при создании таблицы fts:

-- Create a table using the simple tokenizer.
CREATE VIRTUAL TABLE simple USING fts3(tokenize=porter);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...