Не проектируя специально для такого рода поиска, вы застряли либо с использованием сложных многочастных предикатов, либо с повторными выборками для покрытия каждой пары атрибутов поиска/строки. Для M
условий поиска и N
строковых атрибутов вы получаете либо один предикат с компонентами M x N
, либо M x N
отдельные выборки. Оба эти варианта сосут.
Но с некоторой предварительной работой вы можете обойти эту проблему. Вот несколько вариантов для рассмотрения:
Добавить новое поле «SearchText» к вашему лицу
Добавить новый атрибут строки в описании объекта называется searchText
. Это поле составлено из всего текста из любого другого строкового атрибута, но в нормализованной форме (например, в нижнем регистре) в одном месте. В любое время, когда данные в другом строковом поле изменяются, вы обновляете searchText
. При поиске вы используете этот атрибут. Ваш предикат имеет такое же количество компонентов, сколько количество поисковых запросов, которое должно быть намного быстрее.
В этом случае ваш предикат будет сложным предикатом И, где каждый термин имеет формат @"searchText contains %@"
.
Или ...
Добавить новый «SearchText» сущность
Создать новый тип объекта под названием SearchText
, который имеет один строковый атрибут. Настройте отношения «один ко многим» вашего текущего типа сущности к новому типу SearchText
. Каждый экземпляр вашего типа объекта будет относиться к одному экземпляру SearchText
для каждого возможного условия поиска. Это по-прежнему требует предиката с несколькими частями, но поскольку текстовое поле намного короче, результаты должны быть намного быстрее.
В этом случае у вас все еще есть сложный предикат И, но в этом случае формат каждой части будет чем-то вроде @"any searchStrings = %@"
(предполагая, что отношение new to-many называется searchStrings
).
У вас есть проблема? Каковы результаты ваших исследований? –