文档章节

用Erlang实现的简易名字搜索

rongtou
 rongtou
发布于 2016/10/10 12:00
字数 724
阅读 371
收藏 7

游戏中一般都会提供根据输入的字符搜索家族,玩家出来。以往的项目要么只能全匹配,要么是通过mysql的模糊搜索来查询的。新项目中全匹配明显不符合要求,而项目设计又不想为了这个功能而加入mysql来增加复杂度,那么剩下的就只有用erlang来实现搜索了。

想当然的就会想到用mnesia来实现,但mnesia只是个KV,功能并不足以实现需求。自己实现一个完整模糊搜索工作量也不小,还好策划的需求并不复杂。

  1. 搜索出来的结果只需几十条用于显示
  2. 不需要分页显示

为了快速的完成,因此决定搜索只支持从前往后的匹配。因为名字本来就有限制输入特殊符号,以及长度限制,所以对于玩家来说也不会有太大的影响。结合需求以及这些限制,整体设计方案就变得简单许多了。接下来就是构建索引,首先将名字abc,拆成aababc,然后将它们都指向abc这个ID。搜索时根据玩家的输入如ab,那么就可以很快的直接找出ababcabdabcd的对应ID了。删除索引也是如此,生成名字索引列表,然后直接删除表项即可。搜索的目的就是想找到自己查询的信息,但根据前面的设计,当玩家完整输入一个完整名字时,有可能因为该索引值对应的ID列表长度已超出显示上限,而没能返回给玩家。所以需要给全匹配的名字增加一个权重,搜索时优先返回权重高的名字回来,这样整体的搜索结果就可以满足要求了。而至于存储,使用ets的bag类型就最方便了。因为设计方案简单,整体核心代码也就50行左右。

前几天看了下代码还是可以继续优化的,因为显示就20条,就没必要把全部名字都索引了,我只需要保存同个索引的最近40条左右即可。删除时只找权重低的,即非全匹配名字的索引来删。这样可以大大的减少索引量,而且搜索时mnesia:dirty_read不会因返回大量数据而耗费了内存。

方案虽然简单,但缺点也很明显。只能从前往后搜索,对于名字开头有特殊符号的,玩家也只能自己输入,才能搜索,而这些符号一般都不太好找。但能花很少的时间,满足80%的功能需求,还是可以尝试下的。

© 著作权归作者所有

共有 人打赏支持
rongtou

rongtou

粉丝 5
博文 9
码字总数 4533
作品 0
广州
程序员
私信 提问
Erlang 语言的作者教你如何入手

本文是从 [erlang-questions] Ways to get started 这篇文章翻译而来。 我是个守旧派 — 你不需要任何强大的开发工具。只需要一个文本编辑器和一个erlang shell。 打开你的文本编辑器: 输入...

红薯
2011/07/21
2.4K
13
RabbitMQ集群Erlang知识扩展

Erlang是 一种通用的面向并发的编程语言 Erlang的推出则是为了打造一款高并发高扩展性的实时系统。例如应用于电信,银行,商业,即时通讯等场合。Erlang的运行时系统内置了对并发,分布式,容...

OpenStack2015
2017/03/01
0
0
[Erlang 0037] Erlang Parameterized Module

把Parameterized Module作为一个Erlang的语法特性而不扯到OOP上去,可能更好理解: ) 本文回答Erlang Parameterized Module是什么?有什么用?怎么实现的?我们能不能用?什么时候使用? 和很多人一...

唐玄奘
2017/12/03
0
0
Go vs Erlang-两个语言在实战中的比较

因为 云巴 http://yunba.io 系统对高并发、低延迟的需求,我们对各个语言、平台做了很多的调研比较工作。这自然就包括致力于开发高并发应用的 Go 和 Erlang。 并发 Go 对高并发的支持通过 go...

Yunba
2015/03/05
405
1
erlang中的命名空间

最近接触的语言多了,自然就开始有一套“这才是好的特征”的准则。 没有语言(姑且这么说,前辈指正)能脱得了name space。所谓命名空间,就是语言用来管理对象、变量的地方,大概可以是一个...

何世友
2011/07/25
666
0

没有更多内容

加载失败,请刷新页面

加载更多

开启genelog

打开genelog genelog 可以记录数据库的操作语句。 首先进入mysql, mysql -u root -p 设置日志位置 set global general_log_file = "/tmp/general.log"; 设置全局global模式 set global gen......

狼王黄师傅
25分钟前
1
0
Java 帝国对 Python 的渗透能成功吗?哈哈

引子 Java 帝国已经成立20多年,经过历代国王的励精图治,可以说是地大物博,码农众多。 可是国王依然不满足,整天想着如何继续开拓疆土, 这一天晚上他又把几个重臣招来商议了。 IO大臣说:...

边鹏_尛爺鑫
今天
8
0
分布式事务解决方案框架(LCN)

什么是XA接口 XA是一个分布式事务协议,由Tuxedo提出。XA中大致分为两部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如Oracle、DB2这些商业数据库都实现了XA接口...

群星纪元
今天
8
0
linux 操作系统 常用命令和软件安装

1.系统时间更新 ntpdate time.windows.com 2.传送文件 rsync -av /home/data/a.dat -e ssh root@192.168.0.100:/home 3.传送文件夹 scp -r /home/data root@192.168.0.100:/home 4.JDK安装 ......

WJtiny
今天
3
0
pg_lightool基于basebackup的单表恢复和块恢复

开源软件pg_lightool,实现了基于wal日志的块恢复。详情参见博客:https://my.oschina.net/lcc1990/blog/1931485。由于wal日志中FPW的不确定性,它不能作为一个数据库恢复的解决方案。目前对...

movead
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部