以我的项目为例使用到的数据库有postgres、milvus以及图数据库neo4j除了数据库外还用了es作为搜索引擎其中只有postgres、milvus存储了语义转化后的向量值为什么这么分PG存向量JSON持久化事务去重UNIQUE(doc_hash,chunk_idx)但JSONB只能暴力算余弦量大不行只做兜底TF检索。这里的关键是doc_hash能保证同一文档不会重复入库chunk_idx则记录分块顺序方便后续按原文位置回溯。虽然JSONB存向量后无法走索引加速只能逐行计算余弦相似度数据量一上来性能就崩但作为兜底方案处理低频关键词召回已经足够。Milvus存向量专做高维ANN2048维IVF毫秒级TopKPG做不到。Milvus 的核心优势在于IVF索引把向量空间划分成多个子簇查询时只扫描最相关的几个簇配合2048维的高维向量依然能保持毫秒级响应。相比之下PG 的暴力扫描在百万级向量下会退化到秒级甚至更慢完全无法支撑实时检索场景。ES只存文本专做BM25倒排补语义漏掉的精确词/型号/人名。ES也能存dense_vector做kNN但本项目不需要一是运维/调参双写成本二是ES kNN大规模不如Milvus三是混合检索要两路独立排序再RRF放一起就失去正交性了。具体来说BM25擅长处理精确匹配比如用户搜RTX 4090这种型号词语义检索可能把它当成普通名词而BM25能精准命中RRF融合时两路检索各自独立打分再合并排名才能发挥互补优势如果都塞进 ES 就退化成单路检索了。一句话PG账本Milvus语义检索引擎ES关键词检索引擎。补充JSONB:即postgre里面存的json的二进制形式为什么Milvus能毫秒级PG做不到milvus里有特殊的索引结构annknnKNN精确最近邻全量算完取最小的K个保证100%准但慢。ANN近似最近邻用IVF/HNSW等索引用损失一点精度换10~100倍速度。比如召回率95%但只要5ms。RAG召回本来就要TopK再让LLM重排丢5%完全可接受。