Sqlite3全文检索是本地搜索引擎,用来搜索大数据量(几十万条聊天数据),文本数据再适合不过。
Sqlite3源码:3.21.0
fts5分词器:移植于微信的fts4分词器并对搜索精度做了调优。
//加载库
System.loadLibrary("sqliteX");
//创建虚拟表
"CREATE VIRTUAL TABLE IF NOT EXISTS message USING fts5(msg,tokenize='wcicu zh_CN');"
使用CMake脚本编译,方便调试及跨平台。
测试类: BenchmarkActivity
测试手机: 华为 mete9
表: 随机生成1-200字符串同时插入普通表和fts表。
表量级: 10w,20w,30w,40w,50w,70w,100w
搜索策略: 每个量级取1,2,3,4个相同关键字测试,每个关键字测试10遍取耗时平均数
搜索语句:
- 普通表:SELECT * FROM message WHERE msg LIKE '%?%'
- fts表:SELECT * FROM ftsmessage WHERE ftsmessage MATCH ?
搜索结果:
- | 关键字/个 | 结果/条 | 耗时/ms | 关键字/个 | 结果/条 | 耗时/ms | 关键字/个 | 结果/条 | 耗时/ms | 关键字/个 | 结果/条 | 耗时/ms |
---|---|---|---|---|---|---|---|---|---|---|---|---|
普通搜索/10w | 1 | 56952 | 432 | 2 | 594 | 497 | 3 | 4 | 489 | 4 | 0 | 486 |
全文检索/10w | 1 | 56952 | 433 | 2 | 594 | 87 | 3 | 4 | 72 | 4 | 0 | 4 |
普通搜索/20w | 1 | 72018 | 841 | 2 | 978 | 913 | 3 | 19 | 894 | 4 | 1 | 909 |
全文检索/20w | 1 | 72018 | 570 | 2 | 978 | 109 | 3 | 19 | 104 | 4 | 1 | 123 |
普通搜索/30w | 1 | 110646 | 1194 | 2 | 2019 | 1371 | 3 | 33 | 1331 | 4 | 2 | 1328 |
全文检索/30w | 1 | 110646 | 784 | 2 | 2019 | 169 | 3 | 33 | 145 | 4 | 2 | 151 |
普通搜索/40w | 1 | 227821 | 1375 | 2 | 5914 | 1823 | 3 | 56 | 1776 | 4 | 2 | 1763 |
全文检索/40w | 1 | 227821 | 1366 | 2 | 5914 | 253 | 3 | 56 | 179 | 4 | 2 | 205 |
普通搜索/50w | 1 | 183989 | 1876 | 2 | 1556 | 2215 | 3 | 32 | 2171 | 4 | 1 | 2167 |
全文检索/50w | 1 | 183989 | 1086 | 2 | 1556 | 176 | 3 | 32 | 184 | 4 | 1 | 233 |
普通搜索/70w | 1 | 257055 | 2629 | 2 | 2333 | 3071 | 3 | 52 | 3014 | 4 | 1 | 3021 |
全文检索/70w | 1 | 257055 | 1667 | 2 | 2333 | 231 | 3 | 52 | 238 | 4 | 1 | 227 |
普通搜索/100w | 1 | 368484 | 3695 | 2 | 8246 | 4372 | 3 | 50 | 4285 | 4 | 1 | 4271 |
全文检索/100w | 1 | 368484 | 2341 | 2 | 8246 | 387 | 3 | 50 | 305 | 4 | 1 | 341 |