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

时间:2018-11-05 19:59:23

标签: ios objective-c nspredicate

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

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

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会计”的员工ID?

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

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

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

预先感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

您可以使用NSCompoundPredicate并为一堆NSPredicates加上各种排序可能性,例如您在示例中所做的排序,但是显然,这仅限于您要编写的单词数的谓词组合。

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

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

诀窍是,您有时会试图在没有全文索引的情况下跨结构化数据进行自由形式的全文本搜索。这是decent blog post(虽然很老),但涉及到这样做的挑战。

另一种方法是设计您的用户界面,以使用户以更易于处理的形式获得数据。例如,为用户提供一个查询表,其中要填写有效字段。或者至少用提示文本为您的开放条目单个文本字段提供提示文本,例如“输入此人的名字和姓氏”或其他有意义的内容