faiss向量检索库(并非向量数据库)

文章目录

faiss # 轻量
chromadb # 中量
milvus # 重量

faiss是一个轻量数据库吗?

轻量 # 对

数据库 # 错,它不是一个完整的数据库(没有服务、没有事务、没有分布式),只是一个向量检索库

安装依赖

注:安装的包名是faiss-cpu,不是faiss

python 复制代码
pip install faiss-cpu
最简单示例

代码:

python 复制代码
import numpy as np
import faiss

data = np.array([
    [1.0, 1.0],
    [1.0, 2.0],
    [5.0, 5.0],
    [5.0, 6.0],
    [9.0, 1.0]
], dtype='float32') # ⚠️ 注意:FAISS 必须用 float32

# IndexFlatL2 代表:计算欧几里得距离(直线距离)
dimension = 2
index = faiss.IndexFlatL2(dimension)

index.add(data)
print(f"📚 库里现在有 {index.ntotal} 条数据")

# 进行搜索 假设用户问了一个问题,它的向量是 (1.1, 1.1) ------ 离 (1,1) 最近
query = np.array([[1.1, 1.1]], dtype='float32')

# k=2 表示返回最近的 2 个结果
D, I = index.search(query, k=2)

print("🔍 查询向量:", query)
print("📏 距离 (越小越近):", D)
print("🆔 找到的索引位置:", I)

# 验证:I[0][0] 应该是 0,因为 data[0] 是 [1.0, 1.0],离 [1.1, 1.1] 最近
print(f"✅ 最相似的数据是第 {I[0][0]} 条,内容是: {data[I[0][0]]}")

只需要关注这3个对象:

1、data (矩阵)

你的数据库内容。必须是 float32 格式的 NumPy 数组。

2、index (索引)

这就是"数据库引擎"。

IndexFlatL2 是最基础的索引,意思是"把所有数据存下来,查的时候一个个算距离"。它不需要训练,适合小数据量(<10万)。

3、D 和 I (结果)

search 函数永远返回两个值。

D (Distance):距离。数值越小,代表越相似。

I (Index):下标。代表这个数据在原来数组里的第几行。

带持久化的简单示例

要实现持久化,核心就是利用FAISS自带的write_index和read_index函数。

python 复制代码
import numpy as np
import faiss
import os

# 定义文件名
INDEX_FILE = "my_faiss_index.bin"
dimension = 2

if os.path.exists(INDEX_FILE):
    print(f"📂 发现本地文件 {INDEX_FILE},正在加载...")
    # 【关键步骤】从硬盘读取索引
    index = faiss.read_index(INDEX_FILE)
else:
    print("✨ 未找到文件,正在创建新索引...")
    # 1.1 准备数据 (注意这里强制转为 float32)
    data = np.array([
        [1.0, 1.0],
        [1.0, 2.0],
        [5.0, 5.0],
        [5.0, 6.0],
        [9.0, 1.0]
    ], dtype='float32')

    # 1.2 建立索引并添加数据
    index = faiss.IndexFlatL2(dimension)
    index.add(data)

    # 【关键步骤】将索引保存到硬盘
    print(f"💾 正在保存索引到 {INDEX_FILE}...")
    faiss.write_index(index, INDEX_FILE)
    print("✅ 保存完成!")

query = np.array([[1.1, 1.1]], dtype='float32')
D, I = index.search(query, k=2)

print("-" * 30)
print(f"🔍 查询结果 (距离: {D}, 索引: {I})")
print(f"当前内存中数据总量: {index.ntotal}")
相关推荐
落木萧萧82510 分钟前
MyBatis 启动的时候都在干什么:从 MappedStatement 说起
java·数据库·后端
g105655913923 分钟前
华为 OceanStor 基础使用入门指南
服务器·数据库·性能优化
潇凝子潇23 分钟前
MySQL buffer pool 计算公式
数据库·mysql
广州灵眸科技有限公司37 分钟前
瑞芯微(EASY EAI)RV1126B display
开发语言·数据库·人工智能·科技·嵌入式硬件
凌晨1681 小时前
MySQL:DML、DDL与TCL精讲
数据库·mysql·oracle
风哥2号1 小时前
数据库教程FGMT04‑生产环境Linux+Oracle19c RAC集群安装配置与项目实战
linux·数据库
Java开发追求者1 小时前
navicat连接新的数据库提示Oracle library is not loaded.
数据库·oracle·oracle11g·oracle library·is not loaded
砚底藏山河1 小时前
存储选型实战:CSV-SQLite-MySQL同机基准(魔码量化实战 #02)
java·数据库·python·金融·maven
huaweichenai1 小时前
spring boot 打包并部署到线上服务
java·数据库·spring boot
明志数科1 小时前
具身智能数据工程观察:从集中式数采工厂到真实场景采集,数据供给路线正在转向
大数据·数据库·人工智能