Можно ли оптимизировать запрос Core Data при поиске совпадающих слов в тексте? (Этот вопрос также относится к мудрости пользовательских SQL и Core Data на iPhone.)
Я работаю над новым (iPhone) приложением, которое является ручным справочным инструментом для научной базы данных. Основной интерфейс - это стандартное табличное представление, доступное для поиска, и я хочу, чтобы ответ типа "как есть", когда пользователь вводит новые слова. Матчи слов должны быть префиксами слов в тексте. Текст состоит из 100 000 слов.
В моем прототипе я кодировал SQL напрямую. Я создал отдельную таблицу слов, содержащую каждое слово в текстовых полях основного объекта. Я проиндексировал слова и выполнил поиск по строкам
SELECT id, * FROM textTable
JOIN (SELECT DISTINCT textTableId FROM words
WHERE word BETWEEN 'foo' AND 'fooz' )
ON id=textTableId
LIMIT 50
Это выполняется очень быстро. Использование IN, вероятно, будет работать так же хорошо, т.е.
SELECT * FROM textTable
WHERE id IN (SELECT textTableId FROM words
WHERE word BETWEEN 'foo' AND 'fooz' )
LIMIT 50
LIMIT имеет решающее значение и позволяет быстро отображать результаты. Я уведомляю пользователя о том, что их слишком много для отображения, если предел достигнут. Это kludgy.
Я потратил последние несколько дней на размышления о преимуществах перехода на Core Data, но я беспокоюсь об отсутствии контроля в схеме, индексировании и запросе на важный запрос.
Теоретически NSPredicatetextField MATCHES '.*\bfoo.*'
будет работать, но я уверен, что он будет медленным. Такой поиск текста кажется настолько распространенным, что мне интересно, что такое обычная атака? Создаете ли вы сущность слова, как я уже говорил выше, и используем предикат "word BEGINSWITH" foo? Будет ли это работать так же быстро, как мой прототип? Будет ли Core Data автоматически создавать нужные индексы? Я не могу найти явных средств для консультирования постоянного хранилища об индексах.
Я вижу некоторые полезные преимущества Core Data в приложении для iPhone. Ошибки и другие соображения памяти позволяют эффективно извлекать базы данных для запросов таблицы, не устанавливая произвольные ограничения. Управление графом объектов позволяет легко перемещать объекты без написания большого количества SQL. В будущем возможности миграции будут приятными. С другой стороны, в ограниченной среде ресурсов (iPhone) я волнуюсь, что автоматически созданная база данных будет раздута метаданными, ненужными обратными отношениями, неэффективными типами данных атрибутов и т.д.
Должен ли я погружаться или действовать осторожно?