在实际电商业务里经常会对推广类产品进行置顶或对老旧商品及具有节日属性的非预热商品进行置底处理,以满足运营同学对自然查询结果干预的需求
置顶
pinned可以实现对指定商品进行置顶处理
这种方式可以将ids中的商品按照对应的顺序在返回结果列表中进行置顶显示
但需要注意的是被置顶商品列表和主query结果列表可以没有交集,也就是说置顶商品可以不在主query查询结果里,那么就会导致置顶商品在用户的检索结果里显得很突兀;为了解决这个问题,我们可以先根据 如下查询获取满足用户query的推广商品
{
"query": {
"bool": {
"filter": [
{
"terms": {
"id": [
"1",
"1137315",
"1006745"
]
}
}
],
"must": [
{
"multi_match": {
"query": "生长发育",
"fields": ["title", "desc"],
"analyzer": "ik_max_word",
"operator": "and",
"type": "cross_fields"
}
}
]
}
}
}
然后根据返回结果使用pinned进行置顶查询
{
"_source": ["title", "desc"],
"query": {
"pinned": {
"ids": [ "1006745" ],
"organic": {
"multi_match": {
"query": "生长发育",
"fields": ["title", "desc"],
"analyzer": "ik_max_word",
"operator": "and",
"type": "cross_fields"
}
}
}
}
}
置底
在不影响全局策略打分的前提下,我们可以借助boosting对策略排序后的商品进行二次重排序,对满足negative的商品乘以一个小于1的系数,以至于能够将返回结果切分为高质与低质两拨商品,这样高质商品组就排在了低质商品组前面,各组商品依然满足基于策略分顺序进行组内排序:
{
"size": 100,
"timeout": "300ms",
"terminate_after": 30000,
"query": {
"function_score": {
"query": {
"boosting" : {
"positive" : {
"match": {
"title": {
"query": "水果消消乐",
"operator": "and"
}
}
},
"negative" : {
"bool": {
"should": [
{
"term" : {
"id" : "1155987"
}
},
{
"query_string": {
"default_field": "title",
"query": "中秋节 OR 国庆节"
}
}
]
}
},
"negative_boost" : 0.01
}
},
"functions": [
{
"filter": {
"match_all": {
"boost": 1
}
},
"weight": 1,
"field_value_factor": {
"field": "product_orders_7",
"factor": 1.43,
"missing": 0.01,
"modifier": "log2p"
}
} ,
{
"gauss": {
"create_time": {
"decay": 0.2,
"offset": "3d",
"origin": "now",
"scale": "150d"
},
"multi_value_mode": "MIN"
}
}
],
"boost_mode": "sum"
}
}
}
上述查询会将商品 “1155987” 及 标题中出现【中秋节】与【国庆节】的商品划分到低质商品组
网友评论