解决问题,全拼检索,分词检索。
1 分析需求:
全局搜索分为2种数据类型:1消息记录,2联系人,群, 聊天文件类型) ,但目前除聊天文件消息记录暂时不需要做fts全局搜索,聊天文件属于消息记录)。
分析需求属性:联系人,好友,群, 群成员,聊天文件类型共同属性:数量有限(不一定),内容,分词方式相同,属于某一业务,需要查询快捷。
2 选数据库:考虑功能实现与数据库读写分离。
fts 单独分库 用wcdb微信数据库 基于fts4/fts3; (也可以用sqlite数据库,但综合扩展性不如wcdb)
wcdb支持MMICU 分词,数据迁移支持良好。(MMICU分词器与官方ICU分词器类似,但对中文(象形文字)分词以及ICU库加载做了特殊处理,数据迁移搜索引擎暂时可以不做或延后)。
3 方案实现:
独立DB、读写分离:司派全文搜索在整体架构上独立于主业务,搜索DB也是独立于主业务DB。
3.1**
方案
更新数据:分即时数据与定时更新数据。
定时更新:当主业务数据发生更新时,主业务搜索业务模块更新数据存储到SPTempUpdateOperaterd 表(或者单独第三方数据库)。
引擎搜索模块定时同步SPTempUpdateOperaterd 数据到搜索引擎数据库SPFTSIndex, SPBusMetaDataType表中(主从表放入同一个事物里面)。
即时更新数据:比如本地添加好友,需要即时更新到到搜索引擎里面。。
主业务业务搜索模块更新数据存储到SPTempUpdateOperaterd 表。
即时通知搜索引擎业务模块即时同步SPTempUpdateOperaterd的数据到搜索引擎数据库。
删除数据:
主业务收到删除数据通知删除主业务数据,同时发通知给搜索引擎业务,删除对应数据。
查询数据:
根据关键字分词通过业务模块去fts数据库搜索对应数据。
其中搜索模块需要负责数据处理并存储比如联系人罗亮,存储方式ll,luoliang luo liang 拼装成一条消息,罗亮 需要存1条数据到SPFTSIndex,SPBusMetaDataType中。
3.2**
当主业务需要查询,搜索业务模块接口传递给引擎业务模块, 传递type、subType,content 到搜索业务模块,搜索业务模块查询SPBusMetaData,SPFTSIndex表,级联查询方式查询出数据模型。 并回调给搜索业务模块。
3.3**
搜索引擎主要提供接口 插入接口,查询接口,删除接口,更新接口。
fts查询返回给业务层数据模型(返回数据库模型
indexId | long | 主键,自增 |
| docid | long long | 外键,reference SPFTSIndex(docid) (数据模块返回索引表实体)
| type | long | 业务主类型 |
| subType | long | 业务子类型 |
| busItemId | string | 业务ItemId |
| timestamp | long long | 时间戳 |
| status | long | 数据状态 |
)
4 fts数据库表
**索引表-SPFTSIndex**
| ColumnName | ColumnType | Comment |
| ------------ | :------------- | :--------:|
| docid | long long | 索引表自动生成,RowId的别名 |
| content | string | 索引字段(每插入一条content, FTS会分词,插入索引 |
| tokenize | int | 分词类型(全拼,简拼…) |
**业务元数据表-SPBusMetaData **
| ColumnName | ColumnType | Comment |
| ------------ | :------------- | :---------: |
| indexId | long | 主键,自增 |
| docid | long long | 外键,reference SPFTSIndex(docid) |
| type | long | 业务主类型 |
| subType | long | 业务子类型 |
| busItemId | string | 业务ItemId |
| timestamp | long long | 时间戳 |
| status | long | 数据状态 ,正常数据与脏数据 |
| tokenize | int | 分词类型(全拼,简拼…) |
**司派把业务属性数字化,具体如下表**
**业务主类型-SPBusMetaDataType**
| SPBusMetaDataType | DataType | Comment |
| ------------------------- | :--------: | :---------: |
| SPBusMetaDataTypeUnkown | -1 | 未知业务类型 |
| SPBusMetaDataTypeMsg | 1 | 消息业务 |
| SPBusMetaDataTypeMail | 2 | 邮件业务 |
| SPBusMetaDataTypeSchedule | 3 | 日程业务 |
| SPBusMetaDataTypeContact | 4 | 联系人业务 |
**业务子类型-SPBusMetaDataType**
| SPBusMetaDataSubType | DataType | Comment |
| -------------------------------- | :-------: | :----------: |
| SPBusMetaDataSubTypeUnkown | -1 | 未知子业务类型 |
| SPBusMetaDataSubTypeMsgSender | 100 | 发送者 |
| SPBusMetaDataSubTypeMsgReceiver | 101 | 接收者 |
| SPBusMetaDataSubTypeMsgContent | 102 | 消息正文 |
| SPBusMetaDataSubTypeMsgFile | 103 | 文件名 |
| SPBusMetaDataSubTypeMail | 200 | 邮件业务 |
| SPBusMetaDataSubTypeSchedule | 300 | 日程业务 |
| SPBusMetaDataSubTypeContUser | 400 | 非好友 |
| SPBusMetaDataSubTypeContFriend | 401 | 好友 |
| SPBusMetaDataSubTypeContGroup | 402 | 群组 |
5 司派主业务数据库临时操作表: ReadOnly数据库方案2实现需要,不建议再建readOnly数据库暂存在司派主业务数据库。
** -SPTempUpdateOperater**
ColumnName | ColumnType | Comment |
| ------------ | :------------- | :---------: |
| indexId | long | 主键,自增 |
| type | long | 业务主类型 |
| subType | long | 业务子类型 |
| busItemId | string | 业务ItemId |
| operaterType | long | 任务类型 |
| timestamp | long long | 时间戳 |
| status | long | 任务状态 |
| content | string | 内容 |
备注:微信建了3个数据库 主业务数据库,ReadOnly数据库,fts数据库