【问题标题】:How to do a CloudKit full text search that includes a token search如何进行包含令牌搜索的 CloudKit 全文搜索
【发布时间】:2015-04-05 10:46:18
【问题描述】:

我正在尝试创建 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" OR 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 次查询并组合结果并不是一个真正的选择。

【问题讨论】:

  • 您是否尝试过使用 NSCompoundPredicate 代替?
  • 感谢您的提示。不幸的是,它具有相同的结果。在谓词中使用 OR 似乎存在问题。

标签: search full-text-search nspredicate cloudkit


【解决方案1】:

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

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

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

【讨论】:

  • 但这不是一个连接。一个记录类型只有 2 个条件。使用 AND 时没关系,使用 OR 时会报错。我认为 OR 查询存在问题。当谓词为:(from = 'me' and to = 'you')或(from = 'you' and to = 'me')时,我现在在过滤消息时遇到同样的问题
  • 根据documentation,唯一支持的复合谓词运算符是AND, &&, NOT。 CloudKit 不支持 OR 运算符。这不是错误 - 这是服务器的已知限制。
  • 啊!不敢相信我已经读过了。奇怪的是不支持。我会将其添加到答案中。你应该得到奖金。
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 2012-07-29
  • 2015-09-24
  • 1970-01-01
  • 2020-05-08
相关资源
最近更新 更多