Основной запрос данных медленный - PullRequest
4 голосов
/ 29 января 2010

В чем секрет подтягивания предметов, которые соответствуют символам, введенным в строку поиска, которые мгновенно реагируют? Например, если я наберу букву «W» в строке поиска, все фразы, содержащие букву «W» в любой позиции символа внутри фразы, будут возвращены немедленно.

Таким образом, если база данных из 20 000 фраз содержит 500 фраз с буквой «W», они появятся, как только пользователь введет первый символ. Затем при вводе дополнительных символов список автоматически становится короче.

Я могу отправлять запросы на сервер SQL с iPhone и получать ответ такого типа, однако, независимо от того, что мы пытаемся и принимаем предложения других пользователей, мы все равно не можем получить хорошее время ответа при хранении базы данных локально на iPhone.

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

Обратите внимание, что это не то же самое, что индексирование всех слов в каждой фразе, так как это приведет только к совпадениям, в которых слово начинается с введенного символа. В этом случае мы ищем символы в словах.

Ответы [ 3 ]

1 голос
/ 05 февраля 2010

Я думаю, что асинхронная фильтрация результатов - это ответ. Вместо того, чтобы обновлять результаты поиска каждый раз, когда пользователь вводит новый символ, поместите запрос db в фоновый поток при вводе первого символа. Если новый символ вводится до завершения запроса, отмените старый запрос и начните новый. Наконец, вы дойдете до того момента, когда пользователь перестанет печатать достаточно долго для возврата запроса. Таким образом, сам запрос никогда не блокирует ввод текста пользователем.

Я полагаю, что класс UISearchDisplayController предлагает этот тип асинхронного поиска, хотя хотите ли вы использовать этот класс или просто принять шаблон асинхронного проектирования из него, решать только вам.

0 голосов
/ 04 февраля 2010

У меня есть забавная схема для вас. Вы можете построить индекс символов, которые существуют в каждой фразе через 32-разрядное целое число. Переверните биты [0-25], чтобы представить символы (без учета регистра) a-z, которые существуют в фразе. Создайте второе растровое изображение строки запроса. Теперь вы можете выполнять сравнения с помощью побитовых операций (& и |) для определения совпадений. Это очень быстро, и, верьте, хотите нет, SQLite на самом деле поддерживает побитовые операции в запросах - так что вы даже можете использовать эту схему, чтобы перейти прямо к базе данных. У меня есть рабочий код, который делает это встроенным в одно из наших приложений для iPhone - Alphagram.

0 голосов
/ 30 января 2010

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

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