bleve是一个全文搜索引擎,golang里对标java的lucene,但是在结果封装等方面又借鉴了Elasticsearch很多设计,不得不说,不背负历史包袱更方便拨丝抽茧。
本章开始我们尝试分析bleve的源码,个人是不喜欢读他人源码的,1.思想受限。2.破坏自己的风格。当然最主要的是读代码比写代码难 -_-! . 如果你能很好很快的hold住一份复杂代码,你的功底至少比作者高出1个level才实际。不过这不影响咱们读代码。懂不懂不重要,重要的是读没读是吧哈哈。
废话不多说了,直接上一个图,然后嫖一下官网文档,本章交差
上图是bleve的目录结构。golang有着丧心病狂的包引用洁癖,所以go语言的程序分层相当讲究自上而下,这样也很方便阅读。
bleve
是top-level 的package,他的存在是更好的调用,包装下层package。
Analysis
分析器的包,将文本打成term,这个我比较熟,这个包一般不会调用其他包里面的内容,比较独立.
Analyzers
analyzers 就是一个完整的分词器,顺路插一句,bleve的分词器插件比起lucene相对简单不少,一个analyzers里面一般有一个Tokenizer,用于词语片段化,多个TokenFilter。用于过滤转换。
ByteArrayConverters
故名思议,byte数组转换,好吧我实话实说,写这个文章的此时此刻,我还没看过代码这么细的地方。so我感觉不到这个玩意的存在。
DateTime Parsers
时间日期的解析
Language
这个包实现了多种语言的分析器,but没有中文的,lucene里面包了一个smartcn的分词器,话说中文分词器依赖词典模型,反而还是以插件的形式比较稳妥。对于我来说一个standard一个keywords分词器就可以随便浪了,不在乎。
Token Filters
词干抽取的过滤器,停用词呀啥的。
CharFilters
字符过滤,没什么好说的,写转换,全半角转换,啥的。
Token Maps
不知何物,貌似从一个文件读取一个词或短语,还吃了bool表达式。
Tokenizers
分词器,你如果自己写分词器主要是写这里
Document
文档包包含与bleve文档和字段相关的代码。一个文档包含多个字段,一个字段包含多个term。这是bleve中的索引单元。
Index
index包是将索引数据写入到磁盘的功能。方便search。
Store
存储包,是一个文档持久化的工具包,实现了kv接口,可以挂载多个kv数据库。如leveldb rockdb啥的。
upside_down
upside_down包是倒排索引实现。它可以使用任何存储实现。它包含关于如何编码单个行的所有细节。
HTTP
一个简易的api服务,作者的意思是是可用可不用。json协议。
Registry
通过名称提供一些注册服务,类似cache。比如分词器等,应该算是一种设计模式吧。这还有助于序列化索引映射并将它们与索引一起持久化。
Search
搜索包的代码主要是实现搜索方法,这个包依赖index包的接口,然后就不依赖其他了。
Collectors
收集器包负责从所有结果中收集所需的结果并打分。用堆排序,选取topN,
Facets
负责从结果集中收集数据,然后构建
Highlight
高亮包,负责在返回结果中命中高亮文本。没什么好说的
Scorers
Scorers 负责堆搜索结果打分,这个打分可能是中间结果,Collectors来调用,
Searchers
这个包里面包含了实际的搜索实现。后面争取我们可以细致分析
Utils
这个包包含了所有的命令行实现,在新版本里面是cmd包。
实际上你能发现,目前包结构和当前这份文档对不上了。打开时光机回到项目初生的时候看看
果然这老头已变初心