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

Posted

技术标签:

【中文标题】如何进行包含令牌搜索的 CloudKit 全文搜索【英文标题】:How to do a CloudKit full text search that includes a token search 【发布时间】: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 似乎存在问题。 【参考方案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 运算符。这不是错误 - 这是服务器的已知限制。 啊!不敢相信我已经读过了。奇怪的是不支持。我会将其添加到答案中。你应该得到奖金。

以上是关于如何进行包含令牌搜索的 CloudKit 全文搜索的主要内容,如果未能解决你的问题,请参考以下文章

如何对 Cloudkit 记录执行文本搜索?

如何使用ABAP Restful API进行代码的全文搜索

使用 LLBLGen 时如何在 Linq 查询中进行全文搜索

全文搜索是怎么实现的?

Solr 7 - 如何使用地理空间搜索进行全文搜索

NSPredicate 使用 CloudKit 进行不区分大小写的字符串搜索