首页 > 解决方案 > 在 CoreData 的文本字段中搜索单词组

问题描述

我正在实现一个 iOS 应用程序,该应用程序包含一个 CoreData DB,其中一个列包含一个文本字段,用户应该在其上执行多种类型的搜索(语义、完全匹配等选项)。现在,我一直在尝试实现以下 MySQL 查询(Python 实现):

'''select * from quotes where match section against ('\\"%s\\"' in boolean mode) ''' % (query)

上面的查询返回包含字符串“query”的所有单词的所有文本行,没有任何特定的顺序,只要文本字段包含所有单词。例如,“明天是星期六”这样的查询应该在包含“星期六我们要去某个地方。明天是星期五”的字段中找到匹配项。

我尝试了一些方法,例如 NSPredicate 和正则表达式。我在 CoreData 中找不到与 MySQL 布尔模式的直接匹配,但到目前为止我能做到的最好的方法是将正则表达式与 NSPredicate 一起使用,例如:

let queryArray = query.components(separatedBy: " ")
let regex = ".*\\b(" + queryArray.map {
    NSRegularExpression.escapedPattern(for: $0)
}.joined(separator: "|") + ")\\b.*"
let predicate = NSPredicate(format: "textField MATCHES %@", regex)

但是,此查询返回包含初始查询中的一个或多个单词的任何 textField 行,这在我的情况下不是所需的结果。

如何在 CoreData 中实现预期的结果?

标签: iosswiftcore-data

解决方案


对于那些可能会卡住的人,NSCompoundPredicate 为我解决了问题,只需创建一个谓词数组,其中哪个 NSPredicate 实例正在查找字符串中的一个单词,忽略大小写并将 NSCompoundPredicate 应用于 NSFetchRequest。


推荐阅读