HelloGitHub 小程序上线了,蛋只有一个搜索功能

  • 2021 年 5 月 13 日
  • 笔记

作者:HelloGitHub-卤蛋

我是🥚🥚…蛋蛋啊,本文是我从零开发“HelloGitHub 小程序”的开发日记,不要把这个系列当作技术文章来读,你将会收获更多的乐趣。🙆‍♂️

🥺 我只是个 Python 程序员,不会写前端(会的那点前端技术停留在 5 年前),就更甭提微信小程序了。选择开发微信小程序是我认为它:方便、平台大、有搞头。这是我的第一个小程序,如果你想从本文学到什幺小程序的开发经验,那将是在浪费时间还不如转身买个实战课来的直接。“HelloGitHub 小程序”的开发日记——分享我在开发 HG 小程序过程中的思路、问题和解决问题的方案等,文中不会涉及代码以轻松易懂为主。因为我想让 HelloGitHub 的读者都能参与到小程序的建设中,见证它的成长。即使你不懂编程,我也希望能够通过本文让你知道我在干什么,然后你就可以给 HelloGitHub 小程序提需求,增加你想要的功能。让我们共建 HelloGitHub 小程序 😘

背景介绍完啦,下面进入正文。

我要写小程序!

HelloGitHub 微信小程序的原计划:在 3 月份开发,然后 3 月底先上线一版。之所以称为“计划”那是因为它充满了不确定性。

后来因为 3 月 28 是 HelloGitHub 的五周年,结果临时决定办一场直播。我就和团队的小伙伴一起去弄直播的事情了:学习直播、设计活动、拉赞助、排练、邀请嘉宾。整个 3 月份就搭进去了,三月过完小程序一行代码还没有写。我真的很头大!我要写小程序啊!!!💢

(下面这段文字是我 3 月底写的,结果小程序 5 月初才上线!事实证明我对自己开发效率过于乐观了。)

现在五周年直播,算是圆满的结束了。后面的事情我捋了捋,没有什么事情能够阻止我开发 HelloGitHub 小程序啦,那么我就不客气了:开工喽!赶在 5 月前上线!🎉

一、做个啥

我原本计划把 HelloGitHub 小程序做成一个社区(已画好原型图),但这是一个浩大的工程且开发周期太长了,而且闭门造车风险太大。我陷入了深深的沉思😔…

然后我去翻看、调研了其它的小程序,发现小程序大多以工具的形式呈现。所以我打算小步快跑,从单一工具入手。比如:做一个浏览月刊的信息流工具或者开源项目信息聚合浏览的工具。但当我看到 HelloGitHub 公众号 的后台,经常有读者发一些诸如:可视化、爬虫、AI 变脸的消息给我。这些消息像是搜索项目的关键字,他们应该是想要通过关键字搜索项目。后台这样消息太多了,我没有办法查找后挨个回复。HelloGitHub 月刊每月 28 号发刊,已经累计推荐了 1641 个项目,如果想手动从中找一个开源项目实在是太难了,所以我要赶紧给 HelloGitHub 的粉丝做一个能够通过关键字搜索往期月刊中的开源项目的工具,趁你们还没放弃我👋 。

我认为产品就是为了解决某种问题而被创造出来,首先需要先解决用户的痛点。如果制作的产品能像一个方便、实用的“轮子”,那用户就能推着它往前走(督促产品迭代)。当然我要和用户保持“脸贴脸”的距离,及时得到他们的反馈与建议。最后,开发人员应该都喜欢自己开发的程序有人用,那样才会有维护的动力吧💪!

综上所述:

  • 我打算做一个:支持关键字搜索 HelloGitHub 往期月刊中项目的微信小程序,再加个反馈功能。
  • 开发周期:1 个月

二、设计和开发

需求听起来很简单呀:搜索、往期内容,但我没搞过搜索仅仅简单地玩过 ES,还是用来做存储并不是做搜索。

前后端分离先搞起来,搜索服务具体怎么玩,再边走边看。(我现在看这段话,边走边看=自己挖坑😖)

2.1 后端

  • 接口:fastapi(Python Web 框架)
  • 数据库:MySQL
  • 搜索引擎:sonic(Rust 写的轻量级搜索引擎)

2.1.1 服务

我想用 fastapi 很久了,但工作中一直没有机会用它写服务,现在机会终于来了用起来!一个很新、很火、很好用的 Python Web 框架,看名字就知道它是为了快速开发接口而被创造出来(fast api)。

项目地址://github.com/tiangolo/fastapi

虽然要开发的接口很简单:

  • 搜索并返回结果
  • 接收用户对搜索结果的反馈(后面采用了小程序提供的功能)

但需要搭项目的架子:目录结构、日志、配置等等

2.1.2 数据层

HelloGitHub 目前所有月刊的数据都存在 MySQL,为了方便处理已有的数据为搜索提供数据支持,先要做一个数据层搞定 MySQL 的增删改查,这样后面服务、处理数据、分词、数据导入、同步等操作都能够得心应手。我最终选用了 SQLAlchemy 这个 Python ORM 库,去吧 SQLAlchemy!

项目地址://github.com/sqlalchemy/sqlalchemy

2.1.3 搜索

搜索服务选用的是基于 Rust 的轻量级开源搜索引擎 sonic,像用 Redis 一样用上搜索。

项目地址://github.com/valeriansaliou/sonic

它安装方便、配置简单。但第三方的 Python 客户端库是真的难用,而且 Bug 贼多。为了赶进度,我仅解决了一些必要的问题从而能够正常的增删改查,就先凑合用了。

2.2 前端

我没写过小程序所以不打算刚上来就用框架写,否则我连基本写法都不会,可能看不懂小程序框架的文档。而且要实现的功能很简单:

  • 首先,一个输入框接收输入内容
  • 然后,调用搜索服务的接口
  • 最后,展示返回的结果
  • 附加:接收用户的反馈

由于功能简单我看了看文档就写出来了,但样式太丑了我就在官方文档中寻找解决方案。找到了小程序的官方样式库:

项目地址://github.com/Tencent/weui-wxss

拿来就能用的样式文件和示例代码,分分钟让小程序焕然一新。

至此,这里要感谢感谢开源、感谢 GitHub 和微信小程序团队。技术选型和方向敲定了开发也看似顺利,但事情远没有想象中的一帆风顺👻。

三、困难

真是一步一个“困难”,真“好玩”🤪

3.1 问题

下载项目的 README 文件,丰富搜索的关键字的匹配程度。内容需要解析并存储。问题:

  1. 有的文件的内容很多不易存储到数据库,数据库的字段有大小限制。
  2. 如何保证文件的更新
  3. 下载 README 文件有的时候找不到:项目的默认分支不一样、文件名不一致等

搜索部分,随着所有项目的 README 内容写入搜索引擎,搜索的准确率真的是惨不忍睹。原因:

  1. 分词时的自动识别语言不准确
  2. 无法即时查看查询效果
  3. 内容干扰项太多:代码块、链接等

问题一:因为 push 支持可选 lang(语言)指定内容分词时的语言,默认是英语。我试了下但是不支持 “zho”(中文)参数,我就很奇怪,因为项目中说了支持中文的丫。我就去看了看源码,发现 src/lexer/stopwords.rs 分词需要一个叫做 stopword 的东东,然后我找到 sonic/src/stopwords/ 目录,发现里面没有 zho.rs 所以不支持 lang 指定为中文。所以只能用 lexer 的默认分词方式。

问题二:没有命令行客户端无法即时得到反馈。

问题三:我想让内容丰富度更高,但随之而来的是不准确。所以需要整理内容删除干扰项,比如:超链接、代码块。

服务部署因为爬虫的服务器是在 HK,而接口服务需要部署到国内。所以为了接口的响应速度,就把 sonic 部署在国内了。这个比较简单因为支持 docker 直接起服务,则需要:

  • sonic 的 store 目录挂载到本地,防止重启 docker 数据清空
  • HK 服务器可以国内的搜索服务(后面不需要爬虫动态更新搜索中的内容,这个白干了)

另外还需要:安装 Nginx + 新的二级域名 + HTTPS

刚上手小程序和刚上手某一类语言一样会遇到很多琐碎的问题:编辑器设置问题(本地代理导致请求接口超时)、语法报错(获取不到想要的对象,设置值不生效)、不熟悉内置方法导致“原地转圈”(小程序提供了反馈功能、分享需要手动开启等问题)、小程序上线须谨慎因为审核速度完全看脸,当然最大的问题还是编写样式的问题。这个后面慢慢慢…来吧!我买了一本巨厚的前端书籍《Web 前端工程师修炼之道》,容我啃完 CSS 部分再来战!🤫 (CSS 放学别走,门口等我)

3.2 解决方案

  • README 的内容最终我存储成了文件,当作静态文件。(优化后没用到)
  • 在数据库中保存文件的 sha 码,用来检查文件是否改动从而判断是否需要重新写入文件。
  • 我后来发现不指定分支名访问的文件就是默认分支的文件,搞定!另外文件名的话,目前采用的是枚举有限文件名比如:README.md、readme.md…但效率低下且效果不好
  • 解决搜索方面的问题:
    • 把搜索引擎存储的内容降低到月刊的内容,丢弃了 README 的原始内容
    • 编写清理内容干扰项的算法
    • 基于 python-sonic-client 写了一个 cli.py 用于命令行初始化数据和查询
    • 分词的问题:可以给原项目贡献 PR,或者就调研其它搜索,最后可以自己写个搜索引擎(闭嘴!我飘了!)

大致解决了上面的问题,功能就完成能用了。但是搜索准确率是个大问题直接影响用户体验,讲真的我要不要用 Python 写一个搜索引擎,最后可能变成疯狂吐槽自己🤔

四、效果展示

因为微信小程序不可以直接跳转到外部链接,所以只能采用点击搜索结果中的开源项目自动复制项目地址的这种方式。扫一扫在线体验:

五、结束

😇 支持关键字搜索 HelloGitHub 往期月刊中项目的微信小程序终于…上线了!

它虽然功能单一但应该能够解决部分用户的痛点,搜索不准确的问题后面我一定会持续调研优化。如果你有关于搜索的方案欢迎留言讨论,也可以和我分享搜索相关的资料与知识;如果使用中遇到问题可以点击“反馈”告诉我。

💃 觉得好用的话就把它拖到“我的小程序”,然后分享给身边的小伙伴吧 🕺

最后,你有没有遇到过:

找到一个 GitHub 上有趣的开源项目,拿到了项目地址但由于网络问题无论如何就是访问不了。

此情此景是不是脑袋嗡嗡作响,血压直线飙升!我将试图在 6 月中旬发布的版本中解决这个问题,敬请期待 🕶


关注 HelloGitHub 公众号 第一时间收到更新。

还有更多开源项目的介绍和宝藏项目等待你的发现。