如何进行包含标记搜索的 CloudKit 全文搜索

How to do a CloudKit full text search that includes a token search

我正在尝试创建一个 CloudKit 文本搜索查询。 有效的是查询以搜索文本开头的记录,如下所示:

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

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

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

您可以在关闭 EVCloudKitDao 的演示应用程序中看到这些查询(查看屏幕截图)

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

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 个查询并合并结果不是一个真正的选择。

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

这不是很有效,我们知道这个限制。如果您有时间,请求此功能的快速雷达会很有用。

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