IM移动端怎么搜索本地聊天记录

IM软件客户端需要支持本地存储的聊天记录的搜索功能,对于这类非结构化数据(全文数据)一般有两种检索方法。

一、思路

1、顺序扫描法

比如要找内容包含某一个字符串的聊天记录,就是一条聊天记录一条聊天记录的看,对于每一条聊天记录,从头看到尾,如果聊天记录包含此字符串,则聊天记录为要找的条目,接着看下一跳记录,直到扫描完所有的聊天记录。数据量小时,这种方法直接、方便。但是对于大量的数据,这种方法效率很低。

2、全文检索

对非结构化数据顺序扫描很慢,但对结构化数据的搜索却相对较快。将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。

二、原理

假设有2条聊天记录,具体内容如下

(1)今天天气很好

(2)今天可能会下雨

分词

将两条聊天记录进行分词,得到以下词元。今天、天气、很好、可能、会、下雨。(分词是一个很复杂的问题,不在这里细讲。对于移动端的基本检索要求,也可以考虑一元分词,把聊天记录拆成一个一个的字)

索引

创建字典

合并相同词,形成倒排链表

检索

用户输入一个“天气”,立即可以通过上边的索引,检索到第1条聊天记录!

以上仅仅是最基本的原理,每个步骤都还有很多细节需要处理。参看《Lucene 3.0 原理与代码分析完整版》

三、具体怎么做

目前大量的移动端(android,ios)都使用sqlite作为数据库,sqlite中支持fts表(full-text search的简称,有fts3、fts4、fts5三个版本),根据需要选择相应的版本即可实现全文检索功能。

相关阅读

《IM系统的SESSION结构》

《IM系统如何调试TCP协议》

《NAT是怎么回事》

·END·

码农吹牛逼

互联网相关技术

微信ID:farmerbrag

本文分享自微信公众号 - 普通程序员(farmerbrag)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang