核心数据在两个属性上查找单个匹配项

Core Data Find Single Match on Two Attributes

这个用例应该相当常见,但我似乎无法弄清楚或在网络上找到解决它的任何方法。我想使用自然语言搜索员工数据库,即非结构化字符串。

假设您有一个具有以下三个属性的核心数据实体:

firstname string
lastname string
Employee_id string

并且您有以下托管对象

Jane | Smith | 1
Jane | Smiley | 2
Jane | Doe | 3
John | Doe | 4
Richard | Doe | 5

如何获取字符串 'Jane Doe' 或 'Doe Jane' 或 'Doe Jane accounting' 的员工 ID?

如果您确定只有两个单词并且顺序是名字,名字,那么您就可以做到。

NSArray *words = [string componentsSeparatedByString:@" "];   
NSPredicate *pred = [NSPredicate predicateWithFormat:@"firstname beginswith[cd] %@ AND lastname beginswith[cd]", words[0],words[1]];

但在这种情况下,我不知道单词的顺序或数量。

提前感谢您的任何建议。

您可以使用 NSCompoundPredicate 并放置一堆 NSPredicates 以及您在示例中所做的各种排序可能性,但这显然会受到您想要的字数的限制为.

编写谓词组合

(可能很明显,但是您正在创建一系列谓词,例如:((stringA 和 string B)或(stringB 和 stringA),或(stringA 和 stringC)或(stringC 和 stringA)或(stringB 和 stringC ) 或 (stringC 和 stringB) ).

您可以相对干净地创建这些谓词,方法是编写一个带有变量的谓词,然后使用 predicateWithSubstitutionVariables: 重复使用不同的变量字典 -> 单词映射以获得各种排列。

诀窍是,在某些时候,您试图在没有全文索引的情况下对结构化数据进行自由格式的全文搜索。这是一个 decent blog post(虽然很旧)关于这样做的挑战。

另一种方法是设计您的用户界面,让用户以更易于处理的形式向您提供数据。例如,为用户提供一个用于查询的表单,其中包含要填写的有效字段。或者至少用 "Enter the person's first and last name" 或任何有意义的内容为您的打开条目单个文本字段提供提示文本。