2015-04-05 1 views
0

Я пытаюсь создать текстовый поисковый запрос CloudKit. Что делает работу является запрос для записи, которая начинается с поиска текста, как это:Как сделать полнотекстовый поиск CloudKit, который включает в себя поиск токенов

NSPredicate(format: "Text BEGINSWITH %@", searchText)! 

Маркер поиска также работает (запрос, чтобы увидеть, если один из введенных слов где-то в записи), как это:

NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", searchText)! 

Вы можете увидеть эти запросы, работающие в демо-приложение выключено EVCloudKitDao (см скриншоты)

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

NSPredicate(format: "Text BEGINSWITH %@ OR allTokens TOKENMATCHES[cdl] %@", searchText, searchText)! 

Но тогда я получаю эту ошибку CloudKit:

Terminating app due to uncaught exception 'CKException', reason: 'Unexpected expression: Text BEGINSWITH "Y" OR allTokens TOKENMATCHES[cdl] "Y"'

Кроме того, я также попробовал NSCompoundPredicate так:

var p1 = NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", searchText)! 
    var p2 = NSPredicate(format: "Text BEGINSWITH %@", searchText)! 
    var p = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [p1, p2]) 

Но что один дает примерно такая же ошибка:

Terminating app due to uncaught exception 'CKException', reason: 'Unexpected expression: allTokens TOKENMATCHES[cdl] "y" OR Text BEGINSWITH "y"'

Странно, что он работает при использовании AndPredicateType вместо OrPredicateType

Кто-нибудь знает альтернативное решение для такого запроса? Поскольку это функция автозаполнения, выполнение 2 запросов и объединение результатов не является реальным вариантом.

+1

Вы пытались использовать NSCompoundPredicate вместо этого? –

+0

Спасибо за подсказку. К сожалению, он имеет тот же результат. Похоже, что существует проблема с использованием OR в предикатах. –

ответ

5

К сожалению, соединения не поддерживаются в запросах CloudKit. Ваш единственный вариант - запустить два отдельных запроса и объединить результаты этих двух в вашем клиенте.

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

Обновление: В соответствии с documentation единственными поддерживающими составными операторами предиката являются AND, & &, NOT. Оператор OR не поддерживается в CloudKit. Это не ошибка, это известное ограничение сервера.

+0

Но это не соединение. Это всего лишь 2 условия для одного типа recordType. При использовании И это нормально, при использовании ИЛИ вы получите ошибку. Я думаю, что есть проблема с OR-запросами. У меня теперь есть та же проблема с фильтрацией сообщений, когда предикат: (from = 'me' и to = 'you') или (from = 'you' и to = 'me') –

+1

В [документации] (https: //developer.apple.com/library/prerelease/ios/documentation/CloudKit/Reference/CKQuery_class/index.html) единственными поддерживаемыми операторами составных предикатов являются 'AND, &&, NOT'. Оператор 'OR' не поддерживается в CloudKit. Это не ошибка, это известное ограничение сервера. – farktronix

+0

Argh! Не могу поверить, что я прочитал это. Странно, что он не поддерживается. Я добавлю это к ответу. Вы заслуживаете бонуса. –