如何进行包含令牌搜索的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"而终止应用程序,原因:'意外表达式:Text BEGINSWITH"Y"或allTokens代币匹配[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"OR Text开始切换"y"

奇怪的是,当使用AndPredicateType而不是OrPredicateType时,它确实有效

有人知道这样的查询的替代解决方案吗?由于它是一个自动完成函数,所以执行2个查询并组合结果不是一个真正的选择。

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

这不是很有效,我们意识到这一限制。如果你有时间,快速雷达请求这个功能会很有用。

更新:根据文档,唯一支持的复合谓词运算符是AND,&,不是。CloudKit中不支持OR运算符。这不是一个bug,这是服务器的一个已知限制。

最新更新