iOS输入字符串略有不同(容错搜索)

时间:2014-01-03 12:51:47

标签: ios objective-c core-data search-engine

我想处理来自用户的键盘输入的一些小错误(这是一个概念阶段,所以我还没有任何组件,所以请随意提出一个)。

假设我有CoreData个实体,有1000个输入。我想只搜索一个属性。我想要像UIFetchedResultController中的行为(这可能是一个,但我也可以模拟它的行为)。

一旦agin,我们假设这是水果实体包含属性name并且用户搜索它。他想搜索banana,但他错误地输入bansna(或vanana)。我还想向他展示“香蕉”阶段。

我该怎么做?这可以使用NSPredicate来完成吗?我可以操纵这种“宽容”吗?

我提前使用1000个条目,我假设的搜索速度取决于此容差和数据库大小。那么为此我可能应该从移动服务转向REST服务?在这里寻求建议。

2 个答案:

答案 0 :(得分:4)

核心数据提取请求不支持“容错”搜索。可用 字符串的比较运算符是

  • ==表示完全相同,
  • CONTAINSBEGINSWITHENDSWITH用于子字符串搜索,
  • LIKE用于简单的通配符匹配,
  • MATCHES用于正则表达式搜索。

但是对于“容错”搜索,你需要一些先进的比较算法,比如 Levenshtein distance,可用于确定 如果一个字符串“接近”另一个字符串(并且可能有更多算法)。

由于Core Data fetch请求无法使用“基于Objective-C”的谓词 (例如predicateWithBlock),这意味着你必须获取所有对象和 然后应用容错比较方法。

答案 1 :(得分:1)

将谓词写为:WHERE name like '?anana' or name like 'v?nana' or name like 'va?ana' or name like 'van?na' or name like 'vana?a' or name like 'vanan?'