悟空:用Go语言编写的全文搜索引擎
最近Go语言1.5版正式发布,国内关于Go语言的学习和应用也逐渐火热,InfoQ也将关注并推动国内Go语言社区的发展。悟空开源项目是用Go语言编写的全文搜索引擎,InfoQ记者采访了它的作者陈辉,了解了这个项目背后的一些信息。
\\
悟空搜索引擎的特点是高度可定制,具有如下特性:
\\
- 高效索引和搜索(1M条微博500M数据28秒索引完,1.65毫秒搜索响应时间,19K搜索QPS)\\t
- 支持中文分词(使用作者自己研发的Go语言中文分词工具sego分词包并发分词,速度27MB/秒)\\t
- 支持计算关键词在文本中的紧邻距离(token proximity)\\t
- 支持计算BM25相关度\\t
- 支持自定义评分字段和评分规则\\t
- 支持在线添加、删除索引\\t
- 支持持久存储\\t
- 可实现分布式索引和搜索\\t
- 采用对商业应用友好的Apache License v2发布\
项目的架构如下图:
\\
\\
引擎中处理用户请求、分词、索引和排序分别由不同的协程(goroutines)完成。
\\
- 主协程,用于收发用户请求\\t
- 分词器(segmenter)协程,负责分词\\t
- 索引器(indexer)协程,负责建立和查找索引表\\t
- 排序器(ranker)协程,负责对文档评分排序\
具体的原理可以在入门教程里查看,并且在这个教程里,作者用不到200行Go代码实现一个微博搜索网站。
\\
这个项目的作者是陈辉,以前在Google美国工作,2014年回国后加入阿里巴巴,现在是阿里巴巴广告事业部的大数据营销总经理。
\\
在这篇文档里,他谈到了创建悟空搜索引擎的初衷:
\\
\
知识应该容易获得
\\
……
\\
通用的搜索引擎并不能解决这个问题:首先,不能有针对性的垂直搜索,对内容的抓取和索引简单粗暴,无法得到结构化数据,看不到隐藏的内容属性;其次,通用搜索引擎对内容的排序无法进行定制,实时性不够,无法成为网站社区的有机的一部分。
\\
一个好的网络社区应该允许用户在阅读时搜索,搜索成为阅读的一部分;网站内部的流量应该是个性化的、有机的,而不应该由生硬的推荐系统主导用户阅读的方向。很可惜这样的网络社区很少,这种局面的造成一部分是因为缺乏一个开源的、容易定制的、高效的搜索引擎的存在。
\
\\
他的另一个初衷是认为搜索引擎技术应该普及:“所有大数据领域的工程师都应该在职业生涯的某个时刻试着重写一个搜索引擎,了解一下其中的技术问题,并尝试去解决这些问题。”
\\
InfoQ记者对他进行了采访,了解了他对Go语言的看法,以及悟空搜索引擎背后的一些故事。
\\
InfoQ:您是如何和Go语言结缘的,现在是否仍然关注Go语言?
\\
\
陈辉:最早是从Google内部的海报上知道Rob Pike给的TechTalk,关于一种新的编程语言,我对新的编程语言一直比较感兴趣,于是就去听了一下。
\\
当时在Google内部有一种鄙视Python的风气,有个资深的工程师还写了一篇文章《为什么你不应该用Python》,认为超过100行的代码就不应该用Python写。我自己在使用Python时也很头疼,感觉这就是一种ad hoc的语言,写出来的代码很不好维护,更要命的是还很丑陋,写完就不想再多看一眼。
\\
听完TechTalk的第一感觉就是Go可以取代Python进行快速开发,于是用Go写了几个内部小项目,非常顺手,当时Rob Pike还亲自review了我的代码,给了不少使用规范的建议。
\\
后来我的开源项目基本上都用Go写了,包括中文分词,机器学习等,见我的GitHub项目列表。
\\
现在因为工作比较忙很少再写,不过如果有人想重头创作一个项目,我仍然会向他推荐Go。
\
\\
InfoQ:说说您使用Go语言的体会,它有哪些优缺点?
\\
\
陈辉:最大的优点是易于维护,代码写完之后几个月再去看完全没有生疏感,仿佛在Go中实现一个功能只有这么一种写法。而且还有gofmt这个格式化工具,让团队中所有人的代码风格都是一样的。Go是一种不会让团队其他小伙伴看代码时皱眉头的语言,没有什么比这更重要了。
\\
其次Go语言有C语言的优势,但没有C++的弱点。首先是强类型语言,任何严肃的软件项目都不应该选择使用弱类型语言。然后Go的interface能满足90%以上的OOP需求,但又没有C++的种种陷阱。最后,执行速度足够快。
\\
然后,Go有很好的代码管理、build和profiling功能。import一个GitHub的就好像使用本地目录一样,这天然解决了开源软件中的协同开发的问题。profiling的能力强大,加上build体系替代了一个好的IDE的最主要的功能。
\\
最后,goroutines提供了天然的并发编程支持,这也是我最喜欢使用的功能之一。
\\
当然它也不是没有缺点,在我眼里Go的缺点:对virtual function的支持不是很好(或者不存在?),无法通过继承实现代码复用。另外,pointer的使用有时候让人困惑。
\
\\
InfoQ:请介绍一下“悟空”开源项目的开发历史。
\\
\
陈辉:最早是13年7月开始写的,基本上是利用周末的时间,花了一个月写完了悟空最主要的代码,8月初扔到了GitHub上。14年一月份给引擎添加了持久存储,中间有几位contributor贡献了代码。
\\
透露一下,阿里巴巴内部有使用悟空。
\
\\
InfoQ:悟空和其它搜索引擎相比,有哪些特点?
\\
\
陈辉:据我所知还有一个Go写的搜索引擎,Bleve,不过好像不支持中文分词。
\\
悟空不是一个完整的搜索引擎,我也从来不打算让它变完整。我只想写一些容易被修改的、能融入你的业务需求的基础代码,这些代码只实现基本功能,同时也足够精简,让你能了然于心,可以快速修改实现你想要的功能。换句话说,你只要花一天时间就可以熟悉悟空的代码,让它成为你自己的搜索引擎。
\
\\
InfoQ:能否介绍一下悟空搜索引擎应用到高并发和大数据量场景下,可能会出现的性能瓶颈?以及有哪些优化手段?
\\
\
陈辉:目前悟空的索引结构都是基于内存的,单机的内存大小成为瓶颈。解决方式有两个,一是引入SSD等存储,二是分布到多台机器上。我比较倾向于后者,因为内存会越来越便宜。
\
\\
InfoQ:悟空搜索引擎未来有什么开发计划?
\\
\
陈辉:如果有时间,可能会加入docker的支持。
\
\\
如果你想了解更多关于悟空搜索引擎,这里有.NET社区知名开发者Oren Eini的一篇探索它代码的文章,感兴趣的读者可以阅读。
悟空:用Go语言编写的全文搜索引擎相关推荐
- c语言编写fun函数使其实现,函数式语言Corefun的设计与实现(全文完整版)
<函数式语言Corefun的设计与实现.ppt>由会员分享,可免费在线阅读全文,更多与<函数式语言Corefun的设计与实现>相关文档资源请在帮帮文库(www.woc88.co ...
- 全文搜索引擎选 ElasticSearch 还是 Solr
点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 来源:http://t.cn/Ebgm7sn 最近项目组安排了一个任务,项目中用到了全文搜索,基于全文 ...
- 【全文搜索引擎】Elasticsearch相关介绍与linux系统安装
概念 Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java语言开发的,并作为 ...
- 全文搜索引擎选 ElasticSearch 还是 Solr?
最近项目组安排了一个任务,项目中用到了基于 Solr 的全文搜索,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量同步. 而且它还是其他团队在维护,依赖性太强,导致 Solr 服务 ...
- 全文搜索引擎 ElasticSearch 还是 Solr?
原文链接 最近项目组安排了一个任务,项目中用到了全文搜索,基于全文搜索 Solr,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量同步,而且是其他团队在维护,依赖性太强,导致 So ...
- 全文搜索引擎的比较-Lucene,Sphinx,Postgresql,MySQL?
本文翻译自:Comparison of full text search engine - Lucene, Sphinx, Postgresql, MySQL? I'm building a Djan ...
- 全文搜索引擎----ElasticSearch和Solr
全文搜索引擎 ElasticSearch 还是 Solr? 最近项目组安排了一个任务,项目中用到了全文搜索,基于全文搜索 Solr,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量 ...
- 全文搜索引擎ElasticSearch
什么是ElasticSearch? Elasticsearch和Redis, Mysql一样,不仅服务于Java语言,其它语言也可以使用, 它的功能也类似一个数据库,能高效的从大量数据中搜索匹配指定关 ...
- 站内搜寻引擎 php mysql_迅搜(xunsearch) - 开源免费中文全文搜索引擎|PHP全文检索|mysql全文检索|站内搜索...
热点新闻 本软件趋于稳定,版本发布速度放缘,久违了,这次加入支持通过 composer 管理 PHP-SDK,并加入 yii2 扩展支持!非常高兴能在今晚发布 xunsearch-1.4.9 正式稳定 ...
最新文章
- linux nginx ssl 文件路径,linux – 如何将SSL证书从Apache服务器传输到NGINX服务器
- rk android8.1加密,Android 8.1RK平台增加自定义脚本,修改文件权限
- centos加单个ip和批量添加
- synchronized 和 volatile 关键字的作用
- boost::fruchterman_reingold_force_directed_layout用法的测试程序
- hadoop示例源码位置
- iconfont使用
- casefold()方法
- viewgroup的使用方法
- bme280中文技术手册_华为认证数通高级路由交换技术高级工程师 V1.0发布通知
- 无线通信设备安装工程概预算编制_建筑安装工程,预算编制中易遗漏总结分享...
- 湖南工大计算机学院大一分班,大一新生入学计算机分级教学考试会影响分班吗?...
- micropython esp8266教程_ESP8266 Micropython – 连接大学Wi-Fi(WPA2 Enterprise PEAP)
- 华为python673集_实现Redis Cluster并实现Python链接集群
- 如何设置html的背景效果,背景图片的透明度如何设置(CSS)
- css 获取第N个子元素
- AI行业分析与面试指南
- 2.4gwifi最高下载速度_2.4gwifi最高下载速度
- github优秀项目源码汇总---Android
- 学生管理系统课程设计
热门文章
- 豪斯医生改名换姓上演《我的“钱”半生》?
- IT行业工资高,但并不适合所有人
- WebGL和OpenGL的区别及关系
- 明白这十个故事--你也就参悟了人生
- T237012 体积
- 通达+oa+php+文件+乱,通达OA 任意文件上传+文件包含导致RCE
- C++基础—缺省参数
- 华为欧拉系统的网络问题
- win8服务器设置虚拟机,win8系统怎么安装虚拟机 win8系统安装虚拟机的详细图文教程...
- CODING —— 云原生时代的研发工具领跑者