没有大惊小怪的多指数混合矢量数据库 /搜索引擎
SEMADB是一种多指数,多矢量,基于文档的矢量数据库 /搜索引擎。它旨在提供清晰易用的JSON RESTFUL API。 SEMADB的原始组件是为Semafind的一个知识管理项目而建立的,然后才将其发展为独立项目。目的是提供一个简单,现代,高效的搜索引擎,可用于各种应用程序。
寻找托管解决方案? SemadB Cloud Beta可以在RapidApi上找到。
要从源头开始,请按照说明进行安装。这是运行SEMADB所需的唯一依赖关系。我们试图使SemadB尽可能地保持独立,并与最新的GO版本保持最新。
SEMADB从YAML文件中读取所有配置, config夹中包含一些示例。您可以使用:
SEMADB_CONFIG=./config/singleServer.yaml go run ./如果您使用VS代码作为编辑器,则已经有预先制作的任务可以执行相同的操作,但也可以在调试模式下在本地启动集群。
运行服务器后,您可以使用示例文件查看可以向服务器提出的一些示例请求。要充分利用它,请安装REST客户端扩展名,该扩展名使您可以直接在编辑器中提出请求并显示结果。
您可以使用以下存储库容器映像运行最新版本的SEMADB:
docker run -it --rm -v ./config:/config -e SEMADB_CONFIG=/config/singleServer.yaml -v ./data:/data -p 8081:8081 ghcr.io/semafind/semadb:main
# If using podman
podman run -it --rm -v ./config:/config:Z -e SEMADB_CONFIG=/config/singleServer.yaml -v ./data:/data:Z -p 8081:8081 ghcr.io/semafind/semadb:main它将运行主分支。还有针对特定版本的标签版本。请参阅存储库稳定和生产准备版本的容器注册表。
您可以在本地构建和运行容器图像:
docker build -t semadb ./
docker run -it --rm -v ./config:/config -e SEMADB_CONFIG=/config/singleServer.yaml -v ./data:/data -p 8081:8081 semadb
# If using podman
podman build -t semadb ./
# The :Z argument relabels to access: see https://github.com/containers/podman/issues/3683
podman run -it --rm -v ./config:/config:Z -e SEMADB_CONFIG=/config/singleServer.yaml -v ./data:/data:Z -p 8081:8081 semadb数据持久性: SEMADB将数据存储在磁盘上的目录中,该目录在配置文件中指定为rootDir 。默认情况下,数据目录为./data ,并且semadb可执行文件位于/给出/data作为容器中的安装点。
请注意,使用Docker时,可能需要根据Docker的网络配置来调整IPS的主机名和白名单。将主机名作为空白字符串和将白色列入'*'设置为“*”为singleServer.yaml配置中完成的每个连接打开semadb。
欢迎捐款!请阅读贡献指南文件以获取更多信息。贡献指南还包含有关SemadB架构以及如何开始开发的信息。
SEMADB的核心矢量搜索算法基于以下出色的研究论文:
其他索引(例如字符串或文本)遵循倒置索引方法。倒置索引是一个数据结构,该数据结构将内容(例如单词或数字)存储到数据库文件中的位置,或在文档或一组文档中。倒置索引的目的是允许快速全文搜索,字符串前缀查找,整数范围搜索等。
SEMADB具有Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz商品工作站,带有16GB RAM的SEMADB在标准基准中获得了良好的召回率,类似于报告的结果:
| V1 | v2 | V2-PQ | V2-BQ | |||||
|---|---|---|---|---|---|---|---|---|
| 数据集 | 记起 | QPS | 记起 | QPS | 记起 | QPS | 记起 | QPS |
| 手套100角 | 0.924 | 973.6 | 0.853 | 773.9 | 0.526 | 628.6 | ||
| DBPEDIA-OPENAI-100K角 | 0.990 | 519.9 | 0.920 | 240.8 | 0.766 | 978.6 | ||
| 手套25角 | 0.999 | 1130.3 | 0.992 | 914.4 | 0.989 | 805.8 | ||
| Mnist-784-Euclidean | 0.999 | 1898.6 | 0.999 | 1267.4 | 0.928 | 571.6 | 0.667 | 2369.7 |
| NYTIMES-256角 | 0.903 | 1020.6 | 0.891 | 786.7 | 0.438 | 983.6 | ||
| SIFT-128-EUCLIDEAN | 0.999 | 1537.7 | 0.991 | 1272.9 | 0.696 | 967.4 |
结果是使用ANN基准获得的。每秒(QPS)的查询在内存缓存中使用,其单个线程类似于其他方法,但并不能很好地表明整体性能。完整的管道将较慢,因为请求的端到端旅程具有HTTP处理,编码,查询,解析,验证,验证,群集路由,远程过程调用,磁盘加载数据的开销。但是,从理论上讲,单个碎片中搜索算法的原始性能与研究论文中报道的相似。
版本1(V1)是SEMADB的原始纯矢量搜索实现。版本2(v2)是多指数,混合,关键字搜索等实现的实现,它具有更高的解码开销,将数据派遣到索引和使用量化器。使用产品量化(V2-PQ)和二进制量化(V2-BQ)的版本2使用相应的量化方法来减少内存使用量。我们希望召回率较低,因为量化方法是有损的,搜索是近似的。
冷磁盘启动可能真的很慢。链的底部位于所有数据存储的磁盘上。有两个缓存:内存中缓存和操作系统文件缓存。 OS缓存不在我们的控制中,并且在读取或写入文件时被填充。提出请求后,索引图将遍历,并将点从磁盘加载到操作系统缓存,并解码为内存中的点集。搜索操作通常会从磁盘上执行随机读取,因为它遍历相似性图。因此,在冷启动过程中,根据硬件的不同,可能需要很长时间(1秒,10秒或更长时间)。因此,强烈建议使用固态磁盘(SSD),因为它们提供随机读数更好。对于单个应用程序部署,这不是主要问题,因为我们期望在操作过程中将一部分数据 /索引在内存或操作系统中缓存。另一种选择是在磁盘上使用定制图形的存储布局,以便更好地与相似性图中的节点的邻居保持一致。
自动水平缩放:可以调整SEMADB中的服务器数量,但仅在启动时同步。使用的会合散列将移动1/n的数据量转移到新服务器,或将删除的服务器数据移回其余数据。由于这仅在启动时发生,因此它更旨在提前或在活载荷下进行扩展。由于跨服务器的竞赛条件,实时自动缩放量很难安全地执行。一些陷阱是:在配置方面落后的服务器将数据发送到旧服务器,而数据传输进行了用户请求,必须处理用户请求,任何错误路由的数据最终都必须到达正确的服务器,如果网络分配了网络,则必须从拆分脑场景中恢复。许多分布式数据库都包含其他机械,这些机械添加了处理这些功能的重大复杂性,例如版本的键,向量时钟等。目前,您可以调整服务器并重新启动群集以重新分发数据。
无需写高可用性:SEMADB已针对搜索繁重的工作负载进行了优化。收集和点写操作需要所有涉及的(已分发数据的服务器)才能参与。在搜索路径中,可以容忍故障,因为它是随机搜索,并且由于无法可用的碎片而偶尔会下降性能。我们卸载在物理服务器中保持健康的系统故障,以至于Kubernetes等容器编排工具。我们假设SEMADB的配置状态将被积极维护,因此,设计中不包含设计中的任何同伴发现或共识算法。这种设计选择再次简化了SEMADB和AIDS的架构,并随着快速发展而进行。原始设计包括与同行发现的共识机制,例如Raft和完全独立的分布式系统,但这被认为是过度的。
那里有许多开源矢量搜索和搜索引擎项目。将SEMADB与其中一些比较以查看是否更适合您的用例可能会有所帮助: