iOS联系人搜索应用

时间:2013-12-27 08:03:40

标签: ios objective-c core-data full-text-search fts4

我正在开发类似于iOS联系人应用的应用。 在我的应用程序中,它将是列表中的大约20000个联系人。 我想在这个应用程序中执行通用搜索。 搜索也应该在我们输入搜索字段

时进行

,搜索“John Australia”将带来John在名字字段中的联系人和澳大利亚在地址字段中的联系人。 我使用了coredata,但它的性能非常差(我不知道可能是我使用的不是正确的谓词,我使用了OR和AND组合的谓词)。

所以现在我转移到sqlite FTS4数据库并使用FMDB搜索联系人。性能比核心数据好得多。

以下是我对FTS4所做的事情

将所有联系人导入coredata文件(uniqID,姓名,年龄,电子邮件,公司,职位,地址,注释)。 现在用uniqID,searchText,displayName

创建了一个fts4虚拟表
create virtual table searchData using FTS4 (guid, searchText, displayName)

并将所有字段插入到fts4表中。 即,例如,

uniqId  name age email               company    title  address             note     
12312 , John,32,johnsock@style.com , style Inc, CEO , Australia Street-4 , bla bla bla  

这是核心数据中的行,它会像这样移动到FTS4表中

  uniqID searchText               displayName
    12312 John                     John
    12312 johnsock@style.com       John
    12312 Style Inc                John
    12312 CEO                      John
    12312 Australia Street-4       John
    12312 bla bla bla              John

现在我在这个sqlite fts 4表中执行搜索。 这是我对“John Australia”的SQL查询

SELECT guid,displayName FROM searchData WHERE searchText MATCH John* INTERSECT SELECT guid,displayName FROM searchData WHERE searchText MATCH Australia*

如果我有3个单词,那么我将有交集3选择查询。 我从这个查询得到的输出工作正常。

从查询中获得结果后,我使用显示名称填充在tableview

我有两个问题。

1如果我有多个单词,那么在与iOS原生联系人应用程序比较时,我仍面临性能问题。

  1. 如果我只搜索一个字,表现非常好,但是 不满意多字搜索。

  2. 我的查询不会使用like搜索电子邮件ID(这是我需要的     结果即使我搜索工作“袜子”。

  3. 我是否可以在此搜索中应用任何算法或逻辑,以便我的搜索速度很快(请考虑多字搜索)。 同时我也可以用类似查询搜索电子邮件ID,保持同样更好的性能

    参考:http://www.sqlite.org/fts3.html

    http://www.swwritings.com/post/2013-04-30-searching-for-speedy-searching

1 个答案:

答案 0 :(得分:1)

我们的项目中有类似的性能问题,sqlite中的pragma命令帮助了我们。您可以使用以下命令进行性能升级

  1. 更改缓存大小(每页为1024字节)

      

    PRAGMA cache_size =页数;

  2. 更改同步书写行为

      

    “PRAGMA synchronous = OFF”

  3. 将临时商店更改为内存

      

    “PRAGMA temp_store = MEMORY”

  4. 这些命令大多数是每个会话,因此您可能必须在每次连接后执行它们。在执行此操作之前,您可能还需要查看文档,因为这些命令会以一定的成本提高性能。这些编译指示命令记录在here