从零开始实现 Go 搜索引擎(一)
这是我关于这个项目https://github.com/geange/lucene-go的第一篇文章。
之前尝试过写一些博客,后面都放弃了,原因就是我把很多业余的时间投入到这个项目的开发中。
这个项目的起因是看了程序员给老婆写菜谱的故事。 在了解了一些搜索基本原理后,简单得出一个结论:这个东西,实现一个 golang 版本的 lucene 可行性非常高。
起初,一切都非常的顺利。而且之前就有大佬已经实现了 go 版本的 lucene:balzaczyy/golucene
。简单阅读一部分源码后,觉得一部分虽然有点看不懂,但是觉得难度不大。但由于这个项目支持的 lucene 版本较低,而且我对 lucene 源码其实并不熟悉,如果在此基础进行进一步开发,难度并不比重新实现更加简单。
因此我选择了一条更简单的道路,我决定使用 Go 从零开始实现一个搜索库。
打开 lucene 官网,原本我选择的版本是 9.2。但是由于后续 lucene 的持续更新,我决定
我下载了 lucene 8.11.2 的源码,并在比较短的时间内实现了core/store
包的内容(主要是一些文件相关的 IO 操作),更加坚定了我的想法:这个事情很简单。
不要等理解这个东西到底是个什么东西的时候再去动手,要在实践的过程中去理解它。
开发到core/index
包时,问题开始变得复杂,但是又不是很复杂,勉强还是能够理解 lucene 的代码设计和实现的。
当我实现了 fst
的算法时,问题变得更加严重了。我按照着 java 的代码实现,一点点去 DEBUG,花了我 1 个多月的时间,逐渐实现了 fst 的算法。这大大鼓舞了我。因为 fst
算法是 lucene 中的一个核心数据结构,用于存储大容量的 KV 数据。但是正是由于 fst
的实现,导致我对完成这个项目有了莫名其妙的无比强大的自信。
正是因为前期遇到一些比较简单的事情,导致我严重误判了这个项目的复杂程度。
直到现在,这个项目也没有达到一个完全可用的状态。但因为这个项目的部分的 demo 已经能够运行起来,所以我也有时间去写一下文章来记录这个项目开发的事情,如果有可能,也可以帮忙点个 star 鼓励下我,或者等项目最终完成再点也可以。
geange/lucene-go: A Go port of Apache Lucene 8.11.2 (github.com)
版权声明: 本文为 InfoQ 作者【geange】的原创文章。
原文链接:【http://xie.infoq.cn/article/fd6f7ff56af540f80c3f2b451】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论