如何进行包含令牌搜索的CloudKit全文搜索

时间:2015-04-05 10:46:19

标签: search full-text-search nspredicate cloudkit

我正在尝试创建CloudKit文本搜索查询。 什么工作是查询以搜索文本开头的记录,如下所示:

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

令牌搜索也有效(查询其中一个输入的单词是否在记录中的某个位置),如下所示:

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

您可以在EVCloudKitDao关闭演示应用中查看这些查询(参见屏幕截图)

但是现在我想结合这两个查询,以便结果感觉更完整。我尝试使用此查询:

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

但是我会得到这个CloudKit错误:

  

因未捕获的异常终止应用程序' CKException',原因:   '意外的表达:文字BEGINSWITH" Y"或者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])

但是那个给出了同样的错误:

  

因未捕获的异常终止应用程序' CKException',原因:   '意外表达:allTokens TOKENMATCHES [cdl]" y"或文字   BEGINSWITH" y"'

奇怪的是,它在使用AndPredicateType而不是OrPredicateType

时确实有效

有没有人知道像这样的查询的替代解决方案? 由于它是自动完成功能,执行2次查询并合并结果不是一个真正的选择。

1 个答案:

答案 0 :(得分:6)

不幸的是,CloudKit查询不支持联接。您唯一的选择是运行两个单独的查询,并将两者的结果合并到您的客户端中。

效率不高,我们已经意识到这个限制。如果你有时间,快速雷达请求这个功能将是有用的。

更新:根据documentation,唯一支持的复合谓词运算符是AND,&&,NOT。 CloudKit不支持OR运算符。这不是一个错误 - 它是服务器的已知限制。