0

我正在开发一个类似于 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 table 中执行搜索。这是我对“John Australia”的 SQL 查询

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

如果我有 3 个单词,那么我将有 intersection 3 select query 。我从此查询中得到的输出运行良好。

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

我有 2 个问题。

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

  1. 如果我只搜索一个词,性能非常好,但对多词搜索不满意。

  2. 我的查询不会用 like 搜索电子邮件 ID(也就是说,即使我用工作“sock”进行搜索,我也需要得到结果)。

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

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

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

4

1 回答 1

1

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

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

    PRAGMA cache_size = 页数;

  2. 更改同步写入行为

    “PRAGMA 同步 = 关闭”

  3. 将临时存储更改为内存

    “PRAGMA temp_store = 内存”

这些命令中的大多数都是针对每个会话的,因此您可能必须在每次连接后执行它们。在实现此功能之前,您可能还需要阅读文档,因为这些命令会以一定的成本提高性能。这些 pragma 命令在此处记录。

于 2013-12-27T09:13:35.830 回答