我正在开发一个类似于 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 原生联系人应用程序相比,我仍然面临性能问题。
如果我只搜索一个词,性能非常好,但对多词搜索不满意。
我的查询不会用 like 搜索电子邮件 ID(也就是说,即使我用工作“sock”进行搜索,我也需要得到结果)。
是否有任何算法或逻辑可以在此搜索中应用,以便我的搜索快速(请考虑多字搜索)。同时,我如何使用类似查询来搜索电子邮件 ID,以保持相同的更好性能
参考:http ://www.sqlite.org/fts3.html
http://www.swwritings.com/post/2013-04-30-searching-for-speedy-searching