searchzin
1.0.0
一个简单的搜索引擎实现。
学习目的,主要是为了了解搜索引擎的实现细节、性能权衡和结构。
这个想法是创建一个从 UI 到数据库系统的同构应用程序。
该应用程序可以使用 docker 或 github 中发布的二进制文件进行部署。
./searchzin -c <path-to-config>.yml
之后您可以查看http://localhost:8080
查看搜索页面。
可以通过默认位于/etc/searchzin/config.yml
中的配置文件进行配置,也可以通过-C key=value
形式提供配置键,第二种形式会覆盖第一种形式。
配置默认值:
port : 8080 # Service port
path :
log : /var/log/searchzin # Log directory
data : /var/lib/searchzin # Data directory
所有项目结构都是用golang制作的,使用gin
框架。
依赖关系使用dep
进行管理。
大部分项目工具链由Makefile
管理,重要目标是:
install
:安装所需的依赖项和 git hooksreadme
:执行README.md
文件包含lint
:执行代码的检查和格式化test
:编译并运行单元测试build
:在dist
中创建一个linux
可分发文件夹run
:使用go run
运行代码run-dev
:创建并运行 docker 容器release
: 创建一个发布docker镜像publish
:使用VERSION
文件的内容作为版本在 dockerhub 上发布 docker 镜像publish-latest
:在 dockerhub 上发布带有latest
标签的 docker 镜像watch
: 对文件修改执行lint
和test
func-test
:在features
文件夹内执行功能测试该搜索引擎有 6 个主要组件:
系统中的每个组件都有明确的职责,并且所有组件协同工作以响应查询和文档索引请求。
它负责存储新创建的文档并为其提供 ID。限制条件是:
id
id
生成,不会发生持久冲突ssd
还是hdd
存储“术语”和文档的反向索引
terms
与文档集关系key
操作策略给定一个新文档,它会理解它并保存在索引数据库和文档数据库中。
解析用户输入并使用树状数据结构将其转换为查询计划。
lucene
的给定一个查询树,在了解限制和执行环境的情况下对其进行优化。
制定结构化计划后,查询将从index
数据库中检索有效数据,此步骤由执行器执行。
该查询语言在很大程度上基于 lucene,以简化设计并了解所做的权衡。
当前将使用的测试场景将按名称、内容和标签对播客进行索引。
基本用法可以在searchzin-example
中找到。
searchzin 可在 MIT 许可下使用。