两大商品数据库全文比对及反向相关性计算技术方案咨询
技术方案实现指导
核心问题解答
你提到的「反向相关性检索」本质是对称查询能力,主流检索引擎均原生支持,完全不需要暴力遍历第二个库(以下简称B库)的所有商品:A库新增商品时,直接把该商品的名称、属性信息拼成检索 query,到B库的索引中执行一次检索即可拿到所有匹配的B库商品及相关性得分,时间复杂度仅和召回结果数量相关,和B库总数据量无关。
具体落地步骤
1. 数据结构预处理
你现有的第三范式行存储结构不适合直接做检索,先做ETL转换为宽表文档结构,每个商品id对应一条独立文档:
- 文档主键绑定商品id
full_name字段存储商品全称,设置为text类型开启全文索引attributes字段存储拼合后的属性键值对,格式可采用[AttributeName:AttributeValue, ...]的数组,同样设置为text类型,如果需要单独针对属性名做权重配置,也可以拆为嵌套字段存储- 新增
source标记字段,区分文档属于A库还是B库,方便后续分区检索
2. 引擎选型
直接选用Elasticsearch即可,完全匹配你的需求:
- 原生支持Python调用,官方提供
elasticsearch-py客户端,直接通过pip安装即可调用所有接口 - 自带全文检索、模糊匹配能力,7.x及以上版本原生支持向量嵌入检索,可同时兼容你提到的三类匹配方案
- 千万级+百万级的总数据量无压力,单节点即可承载,增量更新性能满足实时同步要求
3. 增量场景适配
- B库新增商品:按你原有思路执行即可,将新增商品的名称、属性拼为检索query,直接在A库的索引中检索,返回结果自带BM25相关性得分,可直接使用
- A库新增商品:和上述逻辑完全对称,将新增A库商品的名称、属性拼为检索query,直接在B库的索引中执行检索,一次查询即可拿到所有相关B库商品的得分,不需要遍历全量B库数据
- 如果需要自定义匹配规则,可通过
bool查询的minimum_should_match参数控制最小匹配项数,也可以用function_score自定义名称、属性的匹配权重,调整得分计算逻辑
可选优化方案
如果需要更高的语义匹配精度,可搭配向量检索方案:
- 用Python调用开源语义模型,将每个商品的名称+所有属性拼合为长文本,生成固定维度的语义向量
- 在ES中新增
dense_vector类型字段存储向量,开启HNSW索引 - 查询时同时执行全文检索和向量检索,用RRF算法混排两类结果得到最终得分,匹配精度远高于单纯的全文检索
数据同步方案
两个源库的增删操作可通过监听binlog的方式同步到ES索引,删除操作直接调用ES的delete接口按文档主键删除即可,同步延迟可控制在秒级,满足业务的实时性要求。
内容的提问来源于stack exchange,提问作者Lerax
相关产品推荐
相关产品推荐

