如何进行包含标记搜索的 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 运算符。这不是错误 - 这是服务器的已知限制。
我正在尝试创建一个 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 运算符。这不是错误 - 这是服务器的已知限制。