我有点怀疑你在刷屏

标签匹配度推荐内容的问题

匿名 | 发布于6 天前 | 阅读数:99

场景及需求:用户画像中给用户打上了上百个标签,商品也打上了标签,现在要做个商品推荐功能,当用户浏览时根据用户标签跟商品标签的匹配度推荐给用户感兴趣的商品,ES查询这个环节怎么样一个实现思路,请各路大神指导下,给个思路或者方向。
已邀请:

God_lockin

赞同来自:

用户的标签在db里存成{ label: score } ,在es里存成 [ label ] 的数组
同样的,商品的标签也存成一样的数据结构
 
召回的时候,在es里通过标签来找到相似标签最多的物品,再从db里拿到对应标签的算总分做排序
匿名用户

匿名用户

赞同来自:

是个新手,能具体些吗?
例如:用户A:对应有标签1、标签2、标签3、标签4、标签5、标签6、标签7......标签100;
商品A的标签是:标签3、标签4、标签5、标签6、标签7
商品B的标签是:标签1、标签2、标签3、标签4、标签5、标签6

要的结果应该是:商品B、商品A这样的顺序

那查询的时候不会把用户A的所有标签都拿去查询吧-_-
 

God_lockin

赞同来自:

用户画像
user_profile:
{
"a": 1,
"b": 2,
"c": 3
....
}

 
商品画像
item_1:
{
"a": 1,
"c": 2
}

item_2:
{
"b": 1,
"c": 2
}

用户ES
user_es
{
"label": ["a", "b", "c"]
}

商品ES
item_1_es
{
"label": ["a", "c"]
}

item_2_es
{
"label": ["b", "c"]
}

推荐:
1. 标签召回
$item_index/_search
{
"query": {
"terms": {
"label": ["a", "b", "c"]
}
}
}
2. 算分
(公式自己定,我乱写一个)
user -> item1
_score * (u_a * i_1_a + u_b * i_1_b + u_c * i_1_c) =>
_score * (1 * 1 + 2 * 0 + 3 * 2) =>
_score * 7

user -> item2
_score * (u_a * i_2_a + u_b * i_2_b + u_c * i_2_c) =>
_score * (1 * 0 + 2 * 1 + 3 * 2) =>
_score * 8
3. 排序 + 分页返回
 
 
 
 

要回复问题请先登录注册