本练习介绍Solr的向量搜索功能,展示如何使用向量嵌入实现语义搜索和推荐系统。
什么是向量搜索?
向量搜索(Vector Search)是一种基于数学向量相似度的搜索技术:
- 将文本、图像等转换为高维向量
- 通过计算向量之间的距离找到相似内容
- 实现语义理解而非简单的关键词匹配
- 支持推荐系统和相似性搜索
核心概念
向量嵌入(Embeddings)
- 将内容转换为固定维度的数值向量
- 相似内容的向量在空间中距离较近
- 可以捕获语义关系
相似度度量
- 余弦相似度:测量向量方向的相似性
- 欧几里得距离:测量向量之间的直线距离
- 点积:结合大小和方向的相似性度量
HNSW算法
分层可导航小世界(Hierarchical Navigable Small World):
- 高效的近似最近邻搜索算法
- 构建多层图结构加速搜索
- 在准确性和性能之间取得良好平衡
设置向量搜索
1. 创建带向量字段的集合
定义10维向量字段的模式:
1 | <fieldType name="knn_vector" class="solr.DenseVectorField" |
或使用Schema API:
1 | curl -X POST -H 'Content-type:application/json' \ |
2. 索引向量数据
示例文档带向量:
1 | { |
批量索引:
1 | curl -X POST -H 'Content-type:application/json' \ |
高级向量搜索技术
1. 推荐搜索
找到与给定电影最相似的电影:
1 | # 使用KNN查询找到最相似的5部电影 |
2. 过滤已观看的电影
推荐时排除用户已看过的电影:
1 | curl "http://localhost:8983/solr/films/select" -d ' |
3. 带流派约束的搜索
只在特定流派中搜索相似电影:
1 | curl "http://localhost:8983/solr/films/select" -d ' |
4. 重新排序结果
使用向量相似度重新排序搜索结果:
1 | curl "http://localhost:8983/solr/films/select" -d ' |
5. 混合评分
结合词法搜索和向量相似度:
1 | curl "http://localhost:8983/solr/films/select" -d ' |
实际应用案例
1. 电商推荐系统
1 | { |
2. 内容推荐平台
1 | { |
3. 语义搜索引擎
1 | { |
向量生成最佳实践
1. 选择合适的嵌入模型
文本嵌入:
- Sentence-BERT
- OpenAI Embeddings
- Google Universal Sentence Encoder
图像嵌入:
- ResNet
- CLIP
- Vision Transformer
2. 向量维度选择
1 | 低维(50-100): |
3. 向量归一化
1 | # Python示例:向量归一化 |
性能优化
1. HNSW参数调优
1 | <fieldType name="knn_vector" class="solr.DenseVectorField"> |
参数说明:
hnswMaxConnections
:每个节点的最大连接数(默认16)hnswBeamWidth
:搜索时的候选集大小(默认100)
2. 批量索引优化
1 | # 使用更大的批次大小 |
3. 缓存策略
1 | <query> |
监控和调试
1. 查看向量字段信息
1 | curl "http://localhost:8983/solr/films/schema/fields/movie_vector" |
2. 调试向量搜索
添加调试参数:
1 | curl "http://localhost:8983/solr/films/select?debug=true" -d ' |
3. 性能指标
监控关键指标:
- 查询延迟
- 索引速度
- 内存使用
- 缓存命中率
常见问题解决
1. 向量维度不匹配
错误:Vector dimension mismatch
解决方案:
- 确保所有向量维度一致
- 检查嵌入模型输出
- 验证字段定义
2. 搜索结果不准确
可能原因:
- 向量质量问题
- 相似度函数选择不当
- topK值太小
解决方案:
- 改进嵌入模型
- 尝试不同的相似度函数
- 增加topK值
3. 性能问题
优化建议:
- 减少向量维度
- 调整HNSW参数
- 使用过滤器减少搜索空间
- 增加硬件资源
总结
向量搜索为Solr带来了强大的AI能力:
- 语义理解:超越关键词匹配
- 推荐系统:基于相似度的推荐
- 多模态搜索:文本、图像等统一搜索
- 个性化:基于用户向量的定制结果
关键要点:
- 选择合适的嵌入模型和维度
- 优化HNSW参数以平衡性能
- 结合传统搜索和向量搜索
- 持续监控和优化
下一步
- 集成预训练嵌入模型
- 尝试不同的相似度函数
- 构建端到端的推荐系统
- 探索多模态搜索应用