写点什么

悟空:用 Go 语言编写的全文搜索引擎

  • 2015-09-02
  • 本文字数:2355 字

    阅读完需:约 8 分钟

最近 Go 语言 1.5 版正式发布,国内关于 Go 语言的学习和应用也逐渐火热,InfoQ 也将关注并推动国内 Go 语言社区的发展。悟空开源项目是用 Go 语言编写的全文搜索引擎,InfoQ 记者采访了它的作者陈辉,了解了这个项目背后的一些信息。

悟空搜索引擎的特点是高度可定制,具有如下特性:

项目的架构如下图:

引擎中处理用户请求、分词、索引和排序分别由不同的协程(goroutines)完成。

  1. 主协程,用于收发用户请求
  2. 分词器(segmenter)协程,负责分词
  3. 索引器(indexer)协程,负责建立和查找索引表
  4. 排序器(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 的一篇探索它代码的文章,感兴趣的读者可以阅读。

2015-09-02 00:2812810
用户头像

发布了 164 篇内容, 共 116.5 次阅读, 收获喜欢 392 次。

关注

评论

发布
暂无评论
发现更多内容

[大厂实践] Netflix 时间序列数据抽象层实践

俞凡

架构 大厂实践

IT服务台深陷手动操作泥潭?ManageEngine卓豪自动化功能释放管理员时间

ServiceDesk_Plus

ManageEngine卓豪

全民趣味测评小程序系统:趣味互动解决方案

微擎应用市场

火山引擎多模态数据湖:AI时代的数据湖如何挖掘图片、视频、语音的“富矿”?

字节跳动数据平台

有没有不会BOM 也能做好生产的攻略啊?抱歉,这真没有!

积木链小链

BOM 智能制造 生产管理

突破风电运维瓶颈!上交大联合昇腾实现联邦学习训练性能飞跃

极客天地

基于开发者空间的电商数据迁移:MySQL到GaussDB的奇幻之旅

华为云开发者联盟

Gauss DB #Mysql 华为开发者空间

百度智能云千帆大模型(武汉)创新中心揭牌,首批23家企业入驻

科技热闻

UI总改版?这个自我修复的AI测试神器让团队告别深夜紧急回滚

测试人

c# ACME client (补充)

八苦-瞿昙

在Sermant中使用外部JavaAgent的最佳实践——以OTEL为例

华为云开源

开源 华为云 微服务治理 sermant

VMware ESXi 8.0U3g 发布 - 领先的裸机 Hypervisor

sysin

esxi

Playwright自动化测试系列课(4) | 异步加载克星:自动等待 vs 智能等待策略深度解析​

测吧(北京)科技有限公司

人工智能 测试开发 playwright agent

用 AI 启航,Gemini 重塑旅游酒店行业新体验

Cloud Ace 云一

AI+ gemini

华为开发者空间-云开发环境,实现PyCharm SSH远程开发

华为云开发者联盟

SSH PyCharm Pro 华为开发者空间

CrossOver玩游戏会损害电脑吗 CrossOver玩游戏会卡吗

凡凡不烦

crossover CrossOver Mac下载 如何在Mac上运行win游戏 苹果电脑必备软件

生产力UP!文心快码 Rules 功能实战指南

Comate编码助手

#程序员 AI辅助编程 AI 代码助手 AI 编程 文心快码

100万QPS短链系统如何设计?

电子尖叫食人鱼

系统开发

数据分析与AI丨F1赛车级数据智能:Altair Panopticon如何助力Prodrive领跑赛事工程?

Altair RapidMiner

人工智能 AI 数据分析 汽车 仿真

「AI+云」共创开发未来:Gemini Code Assist 与 Cloud Workstations 协同释放生产力

Cloud Ace 云一

gemini 云工作站

九块九付费进群系统:社群变现新工具

微擎应用市场

医护年省120小时!这场静默革命正在抢救医院资产

斯科信息

斯科信息 RFID系统 RFID读写器 RFID智能药柜

华为开发者空间部署Dify,构建儿科医生智能应用

华为云开发者联盟

华为云ModelArts dify DeepSeek 华为开发者空间

别再手动筛选训练数据!Bright Data 智能处理,打造一流亚马逊电商AI推荐官

不叫猫先生

爬虫 模型训练 数据集

VMware vSphere 8.0 Update 3g 下载 - 企业级工作负载平台

sysin

vSphere

谷歌云 | 用 AI 启航,Gemini 重塑旅游酒店行业新体验

Cloud Ace 云一

LoongCollector 安全日志接入实践:企业级防火墙场景的日志标准化采集

阿里巴巴云原生

阿里云 云原生 可观测

全面解读 Vue Vapor的事件机制

OpenTiny社区

开源 Vue 前端 组件 OpenTiny

万字深度解析LangGraph如何解决HIL四大行业级痛点?​

聚客AI学院

agent LLM 大模型安全 AI 智能体 LangGraph

VMware vCenter Server 8.0U3g 发布 - 集中管理 vSphere 环境

sysin

vcenter

技术周期揭秘:AI Agent 黄金期还有多久

Techinsight

悟空:用Go语言编写的全文搜索引擎_架构_徐川_InfoQ精选文章