目前,越来越多的网络游戏有在官方网站上提供游戏内部数据(道具数据,任务数据,NPC数据,成就数据等)的检索服务的需求。
以前这种系统,基本上是将游戏内部数据抽取出来,放入到数据库中,然后前端系统使用SQL语句来查询(select和like)。这种实现方式,简单、快速,但是,用户在搜索时,只能少输入词、不能多输入字,不支持权重排序(Rank),匹配度不高,体验不太好。
怎样实现一个体验较好的基于网络游戏资料数据的搜索系统呢?首先,我们来看看需求 。
1.输入任何一个道具名称,任务名称,NPC名称及其中有意义的单词,可以检索出该物品;
2.能够根据与检索关键词的相关度和物品的权重,对检索出来的物品进行排序;
3.能够支持游戏内特殊的关键词;
4.支持分类查询。如,如果类型输入武器、关键字输入刀,则可以检索出该游戏内所有的武器刀;如果类型输入任务、关键字输入刀,则可以检索出该游戏内所有的和刀有关的任务(比如寻刀任务之类的);
5.对于物品描述信息内也含有某关键词的物品,也可以通过该关键词检索到,但是,排序会比较靠后。
根据如上需求,我做了如下分析 。
由于用户输入的随意性,对于前端输入必须使用分词算法将前端输入的词汇分解为多个可以理解的“索引词汇”(索引词汇是指有对应的资料信息的词汇,能够快速查找到该这些资料信息的词汇)。
既然需要索引词汇,则必须由后端系统建立索引。
由于网络游戏检索系统检索的词汇主要是网络游戏词汇,这些词汇和通用搜索系统的词汇有较大的差异性。因此,必须建立一个词汇库。该词汇库前期可以由游戏策划手工录入。但是,手工录入必然存在遗漏,因此,实现一个自完善的词汇库,成为必要。
整体系统流程如下:
后端
1.读入词库
2.读入5000行资料数据,对于每一行记录使用逆向最大比配法和硬匹配法,获取每一行资料数据的索引词汇。根据词汇在资料数据中获取的位置Location(名称,描述等)、位置的权重Rank和出现次数Count,得出Score值:Score=Location*Rank*Count+Location*Rank*Count。将该资料以索引词汇为Key,以Score从大到小的排序插入Cache中,形成Key-Sorted Set的结构。
前端
1.用户输入请求
2.网关过滤有敌意的请求(解决防止重放问题,未授权请求)
3.检索服务使用逆向最大匹配算法将用户输入分解为多个索引词
4.检索服务从Cache中读出多个索引词的数据
5.如果为多个索引词,检索服务使用Merge算法将多个索引词的数据合并
6.将结果返回给用户