云端搜索

https://cloud.tencent.com/document/product/269/81908

腾讯IM SDK有功能叫云端搜索。其实就是消息存储在服务器端,然后客户端需要的时候是可以在服务器端搜索,这样就算本地丢了也没有问题。

但是我们在看限制里是这样定义的:

  1. 功能费999元,每月赠送150万条消息量、30万次请求量
  2. 每月消息量,每超量3万条加收10元
  3. 每月请求量,每超量1万次加收10元

这里我们就会发现几个问题。

  1. 腾讯云端的消息存储是明文的。不大可能当搜索的时候拿着客户端的key去揭秘,然后再进行索引,这个速度肯定是不行的,搜索一条估计一个小时过去了如果这哥们消息多的话。
  2. 这个费用虽然包含150万条,但是随便一个社交app都会超过150万这个数,别说一个月了,就算一天也会超。

抛开上面2个问题,我们看看要自己实现的话应该怎么去做呢?

以现有的技术来看,一般我们都是使用elasticsearch来进行实现,既然叫搜索了,那分词器是必须的。可作为paas产品,你又不知道你客户是中文的,还是日文,还是阿拉伯的,难道我们还不同语言放入到不同的索引,然后不同索引用不同的分词器。这种就需要你提前知道这个客户都是什么语言的。

好,我们先不说多语言,就中文和英文吧。

这里有个限制是150万条,如果客户就要150万条,多了你就给把历史的过期,保留最新的。类似一个队列先进先出,但是却固定长度的。这种方案在redis这样的数据库里是很好实现的,但是在elasticsearch里要实现这个实在是有点重。

同时为了方便删除,我们一般都是按时间去建索引,这样过期了就直接删索引,毕竟在索引内部根据条件去删除的开销还是比较大的,而且空间回收是另外一个问题。

那用MySQL这样的实现呢。我们知道MySQL也是有全文索引的,不过这个方案的存储成本非常高,同时分词器支持的语言会比较少,不像es那般多。

因此通过这个分析我感觉腾讯是不支持只要150万条的这样的要求的,不过这样客户的成本可能就大了去了,真要有客户每天上亿那不就完蛋了,客户钱包完蛋,腾讯的es也得完蛋。