如何基于最高分结果特征调整Elasticsearch查询的相关性评分?
方案合理性评估
你提的加权方案完全合理:
- 6/4/2的权重梯度完全匹配「分类>属性>品牌」的业务优先级,符合你期望的同类型物料优先排序的需求
- 加权总幅度(最高12分)低于你现有文本匹配的分差(示例中正确结果与普通结果分差为10分,多关键词场景分差更高),不会出现无文本匹配的同分类物料抢占正确Top1位置的问题
- 不改变原有召回逻辑,仅调整排序,不会出现漏召回原本符合条件的结果的问题
实现方式
推荐采用两次查询的方案,实现成本极低,且兼容性好,无额外ES配置要求:
步骤1:获取Top1结果的维度值
先执行你的原有查询,仅返回1条结果,提取该结果的三个维度值:
nature.idCat(分类ID)nature.idNat(属性ID)marque.idMrq(品牌ID)
步骤2:带加权规则执行完整查询
在原有查询的bool语句中新增should子句,给三个维度的匹配规则设置对应权重即可,示例查询如下:
{ "sort": [ "_score" ], "query": { "bool": { "must": [ // 保留原有所有查询条件不变 { "query_string": { "default_field": "search", "query": "Photocopieur PANASONIC", "boost": 10 } } ], // 新增加权规则 "should": [ { "term": { "nature.idCat": { "value": 26, // 替换为步骤1拿到的分类ID "boost": 6 } } }, { "term": { "nature.idNat": { "value": 665, // 替换为步骤1拿到的属性ID "boost": 4 } } }, { "term": { "marque.idMrq": { "value": 1244, // 替换为步骤1拿到的品牌ID "boost": 2 } } } ], "minimum_should_match": 0 // 不强制匹配should规则,不缩小召回范围 } } }
额外优化建议
你当前用的通配符查询*photoc*在数据量较大时性能较差,可在ES7.12中给search字段配置NGram分词器,无需通配符即可实现中缀匹配,性能和评分准确性都会有明显提升。
内容的提问来源于stack exchange,提问作者Natty
相关产品推荐
相关产品推荐

