Я отредактировал свой пост, включив в него больше деталей (основываясь на ваших дополнительных предложениях), потому что я думаю, что могу что-то неправильно истолковать,

отаю над функцией поиска в одном из моих приложений на основе Core Data и пытаюсь собрать все советы по оптимизации поиска, чтобы получить ее как можно быстрее. Поиск должен быть достаточно быстрым, чтобы он мог выдавать почти мгновенные результаты для базы данных из 20 000+ объектов.

Что я сделал до сих пор (насколько оптимизация идет)

Реализована методика, показанная в сеансе 137 WWDC 2010: создание сущности ключевого слова и создание отношения ко многим из сущностей моего основного объекта. Ключевое лицоname Атрибут индексируется, и ключевые слова создаются во время начальной процедуры импорта путем разделения соответствующих строк в основных сущностях и их нормализации (без учета регистра и диакритики).С помощью>= а также< бинарные компараторы вместоBEGINSWITHи т. д. Мой формат предиката:

SUBQUERY(keywords, $keyword, ($keyword.name >= $LB) AND ($keyword.name < $UB)).@count != 0

где$LB нижняя граница строки и$UB это верхние границы. Я создаю соединениеAND Предикат, используя этот формат и массив поисковых терминов.

Прямо сейчас я выполняю выборку один раз (когда пользователь печатает первую букву), используя размер пакета выборки около 20, а затем сужаю результаты поиска, используя метод NSArray -filteredArrayUsingPredicate, поскольку они продолжают печатать. Я также предпочитаюkeywords отношения, потому что это используется для фильтрации. Часть, которая занимает больше всего времени, очевидно, является начальной выборкой. Заметная задержка ~ 1-2 с в библиотеке из 15 000 объектов. Профилирование времени показывает, что задержка вызывает именно выборка:

http://cl.ly/3a1b2022452M2V323f2H

Еще одна вещь, которую стоит отметить, это то, что мне нужно получить несколько объектов для получения результатов. Все сущности имеютranking атрибут, но я не могу выбрать более одного за раз, поэтому я вынужден извлечь их отдельно, объединить их в один массив, а затем отсортировать вручную с помощью-sortedArrayUsingDescriptors.

Любые советы о том, как ускорить это будет принята с благодарностью.

РЕДАКТИРОВАТЬ: На основе предложений @ImHuntingWabbits:

После добавленияKeywordFirstChar сущность, моя модель данных (упрощенная) будет выглядеть так:

Теперь вопросыкак бы я написал предикат дляCar сущность, которая выбирает на основеKeywordFirstChar? Единственное, о чем я могу думать, это:

SUBQUERY(keywords, $keyword, $keyword.firstChar.char == %@) где%@ это персонаж для поиска, но я не знаю, как это будет гораздо эффективнее, учитывая, что он все еще должен перечислитьkeywords, если я неправильно истолковал предложения.

Ответы на вопрос(1)

Ваш ответ на вопрос