Elasticsearch语义匹配方案:解决健身计划检索时语义相反结果匹配问题
Elasticsearch区分「减重(Weight Loss)」「增重(Weight Gain)」语义检索实现方案
当前你使用的纯文本匹配策略只会拆分独立词项做命中统计,「Weight Loss」和「Weight Gain」都包含共同词Weight,因此「增重」相关文档会因为匹配到Weight获得较高评分,排名靠前。可通过以下方案解决问题:
低成本规则优化方案
直接通过ES的boosting查询给反向语义词设置负向权重,无需修改索引结构即可快速生效。配置示例如下:{ "query": { "boosting": { "positive": { "match": { "plan_title": "Weight Loss" } }, "negative": { "match": { "plan_title": "Gain" } }, "negative_boost": 0.1 } } }该配置会将命中「Gain」的文档评分压缩为原来的0.1倍,自然会排到结果末尾。如果健身领域反义词对固定,可以提前维护反义词词典,查询时自动匹配插入负向规则即可。
语义向量检索方案(长期最优解)
该方案从语义层面匹配内容,从根本上解决反义内容误匹配问题:- 给索引新增
dense_vector类型的字段,用于存储计划标题的语义向量 - 选用适配通用语义的预训练句向量模型,离线批量将所有存量计划的标题转换为固定维度的向量,存入新增的向量字段中;新增计划时同步生成向量写入
- 查询时,先将查询词转换为同维度向量,再通过ES的
knn查询做向量相似度匹配,「Weight Loss」和「Weight Gain」语义相反,向量相似度极低,不会被召回或获得高评分 - 可将向量检索和原有文本匹配做混合召回,通过自定义评分平衡两者权重,兼顾召回准确率和召回范围
- 给索引新增
自定义词典分词方案
在ES的分词器中新增健身领域专有词组词典,将「Weight Loss」「Weight Gain」这类固定组合定义为不可拆分的独立词项,分词后不会被拆为单个的Weight、Loss、Gain,查询时只有完全命中整个词组才会获得对应匹配权重,避免单独匹配到共同词Weight拿到过高评分。
内容的提问来源于stack exchange,提问作者Pravesh Jain
相关产品推荐
相关产品推荐

