当前位置: 首页 > news >正文

构建高效搜索系统 - Faiss向量数据库的快速入门

目录

快速入门

 创建第一个Faiss索引

 加载数据到索引中

执行基本查询

评估索引性能


快速入门

 创建第一个Faiss索引

先需要导入必要的库,并定义一个索引对象。使用最基础的Flat索引作为例子。

import numpy as np
import faiss# 设置向量的维度
d = 128# 创建一个Flat索引,使用L2(欧几里得)距离
index = faiss.IndexFlatL2(d)# 打印索引信息
print("Index created:", index)

先导入numpyfaiss库。指定了向量的维度为128,并创建一个基于L2距离的Flat索引对象。IndexFlatL2是最简单的索引类型,会在内存中存储所有的向量,并计算所有向量间的距离来找出最近邻。

 加载数据到索引中

需要生成一些随机向量数据,并将其添加到刚刚创建的索引中。

# 生成10000个随机向量
nb = 10000
np.random.seed(1234)  # 设置随机种子以确保每次运行都得到相同结果
xb = np.random.random((nb, d)).astype('float32')# 将向量数据归一化到单位长度
xb /= np.linalg.norm(xb, axis=1, keepdims=True)# 添加向量到索引
index.add(xb)
print("Vectors added to index.")

在这个步骤中,先设定了要添加的向量数量为10000个,并生成这些向量。为使距离度量更加有效,将向量进行了归一化处理。最后调用了add方法将这些向量添加到了索引中。

执行基本查询

可以尝试使用一些查询向量来测试索引是否正常工作。

# 生成10个查询向量
nq = 10
xq = np.random.random((nq, d)).astype('float32')
xq /= np.linalg.norm(xq, axis=1, keepdims=True)# 执行搜索,返回每个查询向量的k个最近邻
k = 4
D, I = index.search(xq, k)# 输出结果
print("Distances:")
print(D)
print("Indices:")
print(I)

这里生成了10个查询向量,并设置了返回最近邻的数量为4。index.search函数执行了实际的搜索操作,并返回了两组结果:D表示查询向量到最近邻的距离,I表示这些最近邻的索引号。

评估索引性能

为了评估索引的性能,可以测量查询所需的时间,并检查返回结果的正确性。

import time# 测量搜索耗时
start_time = time.time()
D, I = index.search(xq, k)
end_time = time.time()# 计算查询时间
search_time = end_time - start_time
print(f"Search took {search_time:.4f} seconds.")# 检查结果是否合理
print("Checking results...")
assert D.shape == (nq, k)
assert I.shape == (nq, k)
print("Results are valid.")

     在这段代码中使用Python的time模块来记录搜索操作的起始和结束时间,从而计算出总的查询耗时。还通过断言检查了返回结果的形状是否符合预期,以此验证结果的有效性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • windows C++ 并行编程-并发的异常处理(三)
  • 关于一个早期的计算机网络的理解
  • JAVAEE初阶第二节——多线程基础(上)
  • 数据结构--初步了解(抽象分级)
  • win11快捷键配置
  • 探索 Zed 编辑器:速度与协作的巅峰之作
  • Rainbond 国内最靠谱 docker.rainbond.cc 拉取 dockerhub 容器镜像
  • 中国电力建设集团有限公司 PK 中国能源建设集团有限公司
  • 第七章 用函数实现模块化程序设计
  • 扭矩传感器计量校准常会有哪些问题出现?具体处理办法是什么?
  • 什么软件可以用平板远程控制电脑?
  • PHP一键创建全球参与探索现代在线投票系统
  • 如何通过Spring Cloud Consul增强微服务安全性和可靠性
  • 代码随想录---算法训练营---总结
  • 苹果M4芯片Mac全面曝光 或10月发布
  • 【mysql】环境安装、服务启动、密码设置
  • 【笔记】你不知道的JS读书笔记——Promise
  • 0x05 Python数据分析,Anaconda八斩刀
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • linux安装openssl、swoole等扩展的具体步骤
  • Spring Cloud中负载均衡器概览
  • Terraform入门 - 3. 变更基础设施
  • Twitter赢在开放,三年创造奇迹
  • use Google search engine
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 给第三方使用接口的 URL 签名实现
  • 构建二叉树进行数值数组的去重及优化
  • 将回调地狱按在地上摩擦的Promise
  • 码农张的Bug人生 - 见面之礼
  • 悄悄地说一个bug
  • 学习笔记:对象,原型和继承(1)
  • 一个JAVA程序员成长之路分享
  • 主流的CSS水平和垂直居中技术大全
  • 选择阿里云数据库HBase版十大理由
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • (2)nginx 安装、启停
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)ssm码农论坛 毕业设计 231126
  • (每日一问)基础知识:堆与栈的区别
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 程序发生了一个不可捕获的异常
  • .NET 中 GetProcess 相关方法的性能
  • .Net接口调试与案例
  • .NET命令行(CLI)常用命令
  • .net与java建立WebService再互相调用
  • .Net语言中的StringBuilder:入门到精通
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @hook扩展分析
  • [10] CUDA程序性能的提升 与 流
  • [2544]最短路 (两种算法)(HDU)
  • [AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性
  • [Angular 基础] - 指令(directives)