Bleve目录结构

ansj · · 2237 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

bleve是一个全文搜索引擎,golang里对标java的lucene,但是在结果封装等方面又借鉴了Elasticsearch很多设计,不得不说,不背负历史包袱更方便拨丝抽茧。

本章开始我们尝试分析bleve的源码,个人是不喜欢读他人源码的,1.思想受限。2.破坏自己的风格。当然最主要的是读代码比写代码难 -_-! . 如果你能很好很快的hold住一份复杂代码,你的功底至少比作者高出1个level才实际。不过这不影响咱们读代码。懂不懂不重要,重要的是读没读是吧哈哈。

废话不多说了,直接上一个图,然后嫖一下官网文档,本章交差

image

上图是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包。

实际上你能发现,目前包结构和当前这份文档对不上了。打开时光机回到项目初生的时候看看

image

果然这老头已变初心


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:ansj

查看原文:Bleve目录结构

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2237 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传