Есть ли способ реализовать полнотекстовый поиск (FTS) в SQlite с платформы Android? - PullRequest
6 голосов
/ 20 августа 2010

Я пытаюсь создать приложение, которое собирает множество заметок от пользователей. Я хочу реализовать полнотекстовый поиск по заметкам, чтобы пользователь мог получать релевантные заметки из всего массива заметок. Я ищу решение для этого. Полнотекстовый поиск (FTS) фактически поддерживается SQLite, но доступен ли он для Android? Кто-нибудь может просветить меня об этом?

Ответы [ 3 ]

2 голосов
/ 20 октября 2013

Лично я не считаю хорошей идеей обходить все записи БД в коде и многократно выполнять множество операций (например, toLowerCase).

Лучшим решением было бы создать в вашей базе данных SQL еще одну таблицу с двумя столбцами, одним для ключей, а другим для строк.

Теперь давайте предположим, что у нас есть таблица лиц , поэтому мы создаем другую таблицу * fts_persons *. Каждый раз, когда новый человек добавляется в таблицу персон , новая запись также добавляется в таблицу * fts_persons *. Ключ в * fts_persons * будет таким же, как и в таблице Person , а второй столбец будет содержать все данные, доступные для поиска человека, разделенные символом-разделителем.

Пример:

таблица персон:


1234 | Джо | Саттер | Кингстон Роуд | 23 | работник

таблица fts_persons:


1234 | Джо + Саттер + Кингстон-роуд + 23 + рабочий

Теперь, когда вы выполняете полнотекстовый поиск, вы просто делаете запрос MATCH для ключей в строковом столбце * fts_persons *. Если есть совпадения, вы получите список ключей, для которых вы можете выполнить другой запрос в таблице persons . Или вы можете объединить эти два запроса в один, что сделает все еще быстрее.

Конечно, вы должны синхронизировать таблицы fts с таблицами, для которых они созданы, поэтому каждый раз, когда таблица person обновляется или удаляется, вы должны обновить или удалить соответствующий столбец в * таблица fts_persons * также. Для этого лучше всего использовать триггеры в базе данных SQL

2 голосов
/ 25 августа 2010

Полнотекстовый поиск в SQLite поддерживается в Android.Вы можете увидеть пример его использования в моем приложении здесь:

http://github.com/bpellin/keepassdroid/blob/master/src/com/keepassdroid/search/SearchDbHelper.java

0 голосов
/ 20 ноября 2015

Да, это возможно, вы можете использовать расширения Sqlite для FTS3 и FTS4.Они отлично работают.Таблицы FTS создаются с использованием инструкции CREATE VIRTUAL TABLE.Для получения дополнительной информации о том, как работают таблицы FTS и как вы можете искать термины, посмотрите здесь

Я нашел этот метод очень полезным при поиске в базе данных клиентов -

public static String[] negligibleTokens = {"a", "an", "the", "is", "am", "are", "to"};

public Cursor searchCustomer(String inputText) throws SQLException {
    Log.w(TAG, inputText);

    String[] searchQueryTokens = inputText.split(" ");
    StringBuilder searchQueryBuilder = new StringBuilder();

    for (int i = 0; i < searchQueryTokens.length; i++) {

        if (!Arrays.asList(negligibleTokens).contains(searchQueryTokens[i])) {

            if (i != 0 && searchQueryBuilder.length() > 0)
                searchQueryBuilder.append(" OR" +
                        " ");

            searchQueryBuilder.append(searchQueryTokens[i]);
        }
    }        

    String query = "SELECT docid as _id," +
            KEY_CUSTOMER + "," +
            KEY_NAME + "," +
            "(" + KEY_ADDRESS1 + "||" +
            "(case when " + KEY_ADDRESS2 + "> '' then '\n' || " + KEY_ADDRESS2 + " else '' end)) as " + KEY_ADDRESS + "," +
            KEY_ADDRESS1 + "," +
            KEY_ADDRESS2 + "," +
            KEY_CITY + "," +
            KEY_STATE + "," +
            KEY_ZIP +
            " from " + FTS_VIRTUAL_TABLE +
            " where " + KEY_SEARCH + " MATCH '" + searchQueryBuilder.toString() + "';";
    Log.w(TAG, query);
    Cursor mCursor = mDb.rawQuery(query, null);

    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;

}

Этот метод использует запрос "MATCH" в таблице FTS_VIRTUAL_TABLE.Оператор «ИЛИ» гарантирует, что каждому клиенту даже одно слово из всего текста поиска будет включено в результаты поиска.

Надеюсь, это поможет.

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