我正在开发类似于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原生联系人应用程序比较时,我仍面临性能问题。
如果我只搜索一个字,表现非常好,但是 不满意多字搜索。
我的查询不会使用like搜索电子邮件ID(这是我需要的 结果即使我搜索工作“袜子”。
我是否可以在此搜索中应用任何算法或逻辑,以便我的搜索速度很快(请考虑多字搜索)。 同时我也可以用类似查询搜索电子邮件ID,保持同样更好的性能
参考:http://www.sqlite.org/fts3.html
http://www.swwritings.com/post/2013-04-30-searching-for-speedy-searching
答案 0 :(得分:1)
我们的项目中有类似的性能问题,sqlite中的pragma命令帮助了我们。您可以使用以下命令进行性能升级
更改缓存大小(每页为1024字节)
PRAGMA cache_size =页数;
更改同步书写行为
“PRAGMA synchronous = OFF”
将临时商店更改为内存
“PRAGMA temp_store = MEMORY”
这些命令大多数是每个会话,因此您可能必须在每次连接后执行它们。在执行此操作之前,您可能还需要查看文档,因为这些命令会以一定的成本提高性能。这些编译指示命令记录在here。