2010-01-28 2 views
4

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

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

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

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

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

+0

Какой подход вы сейчас пытаетесь сделать? Вы задаете размер партии в запросе на выборку? – gerry3

ответ

0

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

0

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

+0

Я предполагаю, что Al хочет найти подстроки, а не индивидуальное присутствие набора символов, что и делает эта работа в виде битмаски, как это было бы. Я предполагаю, что когда пользователь наберет «W», если они последуют за ним «e», он должен соответствовать «Weird», но теперь «Where». – VictorB

+0

Я не был уверен в его объяснении. В Alphagram я использую битовую маску в качестве начального фильтра и выполняю второй проход по отфильтрованным результатам, чтобы определить, существует ли точное совпадение. – xyzzycoder

1

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

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