免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2551 | 回复: 1
打印 上一主题 下一主题

Autocompete with Trie [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-12 12:20 |只看该作者 |倒序浏览
Autocompete with Trie



像微薄里面用户输入一个@会从服务器取出匹配的用户login name什么的。这种场景用前缀树比较节省空间并且效率高。fast trie——A super fast, efficiently stored Trie for Ruby。据作者说速度是灰常的快。。
地址:https://github.com/tyler/trie

Java代码
  1. gem install fast_trie
复制代码
Ruby代码
  1. require 'trie'

  2. TRIE = Trie.new

  3. #初始化数据
  4. User.all.each do |user|
  5.   TRIE.add(user.login_name, 0)
  6. end

  7. #js调用autocomplete
  8. def autocomplete
  9.     children = sort_by_weight(TRIE.children(params[:prefix]))

  10.     respond_to do |format|
  11.       format.js { render(:string => JSON.dump(children)) }
  12.     end
  13.   end
复制代码
根据用户的输入行为给某个key增加权重(用于搜索排序):
def incr_weight(login_name, n = 1)
  weight = TRIE.get(login_name) || 0
  TRIE.add(login_name, weight + n)
end

#根据权重给结果排序
def sort_by_weight(login_name_list)
  login_name_list.sort_by{|login_name|  TRIE.get(login_name)}
end

这东西的性能不错啊 这是测试数据,看样子比那个redis的autocomplete要简单高效呀:

引用
Performance Characteristics

Here are some quick benchmarks on my 2.4ghz Intel Core 2 Duo MacBook Pro:

For keys that are 5 characters long:
31,344 adds/second
1,827,408 searches/second
38,453 prefixes searches/second

For keys that are 10 characters long:
30,653 adds/second
1,802,649 searches/second
13,553 prefix searches/second

For keys that are 20 characters long:
30,488 adds/second
1,851,461 searches/second
5,855 prefix searches/second

For keys that are 40 characters long:
30,710 adds/second
1,838,380 searches/second
2,762 prefix searches/second


不过好像不能被序列化。这样在多进程部署的时候有点麻烦呀。再研究一下。。

论坛徽章:
0
2 [报告]
发表于 2011-04-12 20:27 |只看该作者
嗯,做搜索引擎的,可以考虑下,Ruby的库是越来越多了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP