搜索貌似是现在最热门的了,几乎各大 IT 公司都有自己的搜索引擎。百度、腾讯、网易连同淘宝都有了自己的搜索引擎。本文主要谈一下搜索方式和一些简单的搜索设计。
1 大量数据中的搜索:
现今的硬件设备 ( 这里主要指内存 ) 已经比较低廉、容量也越来越大(有些服务器内存容量已经能达到 256G ),因此,能利用内存缓存数据的话进来那个利用内存来存放,当然,为了数据安全,持久化存储方式也是要有的(可以利用文件系统或者数据库来完成)。
内存式的缓存设计要有这么几个要点:缓存的数据一定要是经常用到的数据,并且尽量使单数据比较小(一般以几十 K 为最大限),如果数据量大不能完全放入内存( key-value 对),设计一些置换算法进行数据交换就可以。
2 海量数据中的搜索:
数据海量,意味着你不能把数据全部放入内存了,也就是说磁盘上必须要存放数据,因此 IO 操作是必须的,也就意味着一般情况下数据 IO 操作将主要决定数据查找的性能,因此,搜索算法设计的要点就是想方设法降低 IO 操作次数,并精确分析数据查找的记录,尽量将热点内容放入内存,当内存可使用空间受到限制的话,进行数据置换就可以了。这些存在磁盘上的文件一般可以设计 B+ 树的索引(索引层数一定要合适,尽量避免一次查询多次读取 IO ),倒排索引(根据关键字和其他一些内容分词的方式)。而文件存储中特殊的图片处理则可以采用根据一些映射规则进行合理的名字 hash ,争取让图片名字包换图片的位置信息,然后将文件名以数据字典的方式存放在内存中(持久化的存储也是必须的,数据安全考虑嘛)。
搜索设计:
问题 1 :海量整数中取前 K 大,第 K 大、中位数。【一般都不能直接放入内存,也意味着内排序不可直接使用】。
思路:可以首先对这些数据进行去重操作,形成 key-value ( value 代表出现次数),操作后结果如果可以直接放入内存的话可以利用 hashmap 之内的一些数据结构进行后续操作了。如果还是不能,则对上一步操作结果进行切分,每一个部分读入内存按问题要求进行计算就可以了。
问题 2: 一般的产品搜索设计
前提条件:产品有持久化的描述。
思路:可以把描述进行分词、得到一些关键的产品表征属性、形成数据字典;
初步根据关键属性做出产品的倒排索引;
用户查询时记录用户的查询数据,形成一个查询字典【尽量小】,倒排索引中不存在时,如果搜索成功,则要把查询数据进行恰当的分词,并在倒排索引中添加。这样就简单完成了索引的自学习。
查询字典可以作为纠错、省略、分词的依据使用。
问题 3 图片搜索
前提条件:图片持久化在磁盘上
思路:海量的图片都应分机器存放,多个集群中存放。需要一个图片服务器来维护图片的存放信息【根据名称能够直接找到对应的位置】;还是一样,图片查询时要记录用户的查询信息,统计出热门图片,放入网络状况、硬件状况较好的图片存储机器上【当然更多的冗余份数也是可能有用处的,能提高并发访问量嘛】。