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

Search 如何执行包含令牌搜索的CloudKit全文搜索,search,full-text-search,nspredicate,cloudkit,Search,Full Text Search,Nspredicate,Cloudkit,我正在尝试创建CloudKit文本搜索查询。 工作原理是查询以搜索文本开头的记录,如下所示: NSPredicate(format: "Text BEGINSWITH %@", searchText)! NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", searchText)! var p1 = NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", searchText

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

NSPredicate(format: "Text BEGINSWITH %@", searchText)! 
NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", searchText)! 
    var p1 = NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", searchText)!
    var p2 = NSPredicate(format: "Text BEGINSWITH %@", searchText)!
    var p = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [p1, p2])
令牌搜索也可以这样工作(查询以查看输入的单词是否在记录中的某个位置):

NSPredicate(format: "Text BEGINSWITH %@", searchText)! 
NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", searchText)! 
    var p1 = NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", searchText)!
    var p2 = NSPredicate(format: "Text BEGINSWITH %@", searchText)!
    var p = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [p1, p2])
您可以在演示应用程序关闭时看到这些查询正在工作(请参见屏幕截图)

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

NSPredicate(format: "Text BEGINSWITH %@ OR allTokens TOKENMATCHES[cdl] %@", searchText, searchText)! 
但是我会得到这个CloudKit错误:

由于未捕获的异常“CKException”而终止应用程序,原因: '意外表达式:文本以“Y”或allTokens开头 标记匹配[cdl]“Y”

除此之外,我还尝试了一个NSCompoundPredicate,如下所示:

NSPredicate(format: "Text BEGINSWITH %@", searchText)! 
NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", searchText)! 
    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标记匹配[cdl]“y”或文本 以“y”开头

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

有人知道这样一个查询的替代解决方案吗?
因为这是一个自动完成函数,所以执行两个查询并组合结果不是一个实际选项。

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

这不是很有效,我们也意识到这一局限性。如果你有时间,一个快速的雷达请求此功能将是有用的


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

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

这不是很有效,我们也意识到这一局限性。如果你有时间,一个快速的雷达请求此功能将是有用的


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

你试过使用NSCompoundPredicate吗?谢谢你的提示。不幸的是,结果是一样的。在谓词中使用或似乎有问题。您是否尝试过使用NSCompoundPredicate?谢谢提示。不幸的是,结果是一样的。在谓词中使用或似乎有问题,但这不是连接。一个记录类型只有两个条件。当使用AND时,它是OK,当使用OR时,您将得到错误。我认为有一个问题或疑问。现在,当谓词为:(from='me'和to='you')或(from='you'和to='me')时,我在过滤消息时遇到了相同的问题。唯一支持的复合谓词运算符是
和,&&,而不是
。CloudKit中不支持
运算符。这不是一个bug-这是服务器的一个已知限制。啊!真不敢相信我已经读过了。奇怪的是,它不受支持。我将把这一点补充到答案中。你应该得到奖金,但这不是加入。一个记录类型只有两个条件。当使用AND时,它是OK,当使用OR时,您将得到错误。我认为有一个问题或疑问。现在,当谓词为:(from='me'和to='you')或(from='you'和to='me')时,我在过滤消息时遇到了相同的问题。唯一支持的复合谓词运算符是
和,&&,而不是
。CloudKit中不支持
运算符。这不是一个bug-这是服务器的一个已知限制。啊!真不敢相信我已经读过了。奇怪的是,它不受支持。我将把这一点补充到答案中。你应该得到奖金。