doc_ids_with_update, doc_ids_with_votes 的权重可以进行设置,为 0 时表示不用于排序;为其他数时,表示对应字段对最终排序分所占的权重,正数相当于该字段需要正序排序,负数相当于该字段需要倒序排序。
所思
这种利用分值的方法很巧妙,基本可以实现多字段排序,但是优先级可能难以掌控,难以做到先按照某一字段排序,再按照另一字段排序的形式。因为每个字段对应的分值的数量级可能差别比较小,这个时候如果需要有排序字段的优先级,那么可能需要对每个权重进行精巧地设计才行。
对非数值字段进行排序 P164上面介绍了使用有序集合对多个数值字段进行排序,由于有序集合的分值只能是浮点数,所以非数值字段不能直接用于排序,需要转换成对应的浮点数。但由于双精度浮点数只有 64 个二进制位,实际能使用 63 个二进制位,所以能表示的字符串并不多,只能使用字符串的前几个字符进行分值估计,不足指定字符数的需要补齐到指定字符数。当然如果字符集缩小的话,可以重新进行编码计算,进而可以对更长的字符串进行分值估计。 P165
当这个分值特别大的时候,可能会引发最终计算的分值溢出而出错的问题。
广告定向 P166接下来将介绍使用集合和有序集合构建出一个几乎完整的广告服务平台 (ad-serving platform) 。 P166
对广告进行索引 P167针对广告的索引操作和针对其他内容的索引操作并没有太大的不同,被索引的的广告通常都拥有像位置、年龄和性别这类必需的定向参数,并且往往只会返回单个广告。 P167
广告的价格 P167
按展示次数计费 (cost per view) :这种广告又称 CPM 广告或按千次计费 (cost per mille) ,每展示 1000 次就需要收取固定的费用
按点击次数计费 (cost per click) :这种广告又称 CPC 广告,根据被点击的次数收取固定费用
按动作执行次数计费 (cost per action) :又称按购买次数计费 (cost per acquisition) ,这种广告又称 CPA 广告,根据用户在广告的目的地网站上执行的动作收取不同的费用
为了尽可能简化广告价格的计算方式,将对所有类型的广告进行转换,使得它们的价格可以基于每千次展示进行计算,产生出一个估算 CPM (estimated CPM, eCPM) 。 P168
CPM 的 eCPM 价格可以直接使用 CPM 价格
CPC 的 eCPM 价格可以通过将广告的每次点击价格乘以广告的点击通过率 (click-through rate, CTR) ,然后再乘以 1000 得到
CPA 的 eCPM 价格可以将广告的点击通过率、用户在广告投放者的目标页面上执行动作的概率、被执行动作的价格这三者相乘起来,然后再乘以 1000 得到
将广告插入倒排索引 P169
我们基本可以复用上面提到的搜索功能,除了会将广告的关键词插入倒排索引,还会将广告的定向参数(位置、年龄和性别等)插入倒排索引中,并记录广告的类型、基本价格和 eCPM 价格。 P169
执行广告定向操作 P170当系统收到广告定向请求的时候,它要做的就是在匹配用户定向参数的一系列广告里面,找出 eCPM 最高的那一个广告。同时,程序还会记录页面内容与广告内容的匹配程度,以及不同匹配程度对广告点击通过率的影响等统计数据。通过使用这些统计数据,广告中与页面相匹配的那些内容就会作为附加值被计入 CPC 和 CPA 的 eCPM 价格,使得那些包含了匹配内容的广告能够更多地被展示出来。 P170
计算附加值
计算附加值就是基于页面内容和广告内容两者之间匹配的单词,计算出应该给广告的 eCPM 价格加上多少增量。每个单词都有一个有序集合,成员为广告 id ,成员的分值为当前单词对这则广告的 eCPM 的附加值。 P171
在寻找合适的广告时,我们首先会过滤出匹配定位位置且至少包含一个页面单词的广告,然后通过计算附加值的方法替代搜索,以便实现每次投放价值最高的广告,并能够根据用户的行为学习。同时由于每个广告匹配的内容不同,最优方式应该是使用加权平均值来计算单词部分的附加值,但限于 Redis 本身的命令,我们最终采取 (max + min) / 2 的形式计算单词部分的附加值(max 表示所有匹配单词的最大附加值, min 表示所有匹配单词的最小附加值),采用如下命令即可: ZUNIONSTORE final_score 3 base max min WEIGHTS 1 0.5 0.5 。
从用户行为中学习 P175
首先需要存储用户的浏览记录,包括三部分:(每 100 次就主动更新一次 eCPM ) P175
被定向至给定广告的单词(即:内容中单词和给定广告单词的交集)
给定广告被定向的次数
广告中的某个单词被用于计算附加值的次数
其次需要存储用户的点击和动作记录,用于计算 点击通过率 = 点击量或动作次数 / 广告展示次数。(每次都更新 eCPM) P176
最后就是更新 eCPM ,包括两部分:
广告的 eCPM :根据广告的实际价格和当前广告的点击通过率,计算出最新的 eCPM
广告单词的 eCPM 附加值:根据广告的基本价格和每个单词的点击通过率,计算出每个单词最新的 eCPM 附加值
改进方案 P179随时间流逝:可以仿照 03. Redis 简单实践 - Web应用 文章的 RescaleItemViewedNum 函数进行定期降低广告的展示次数和点击次数(或者动作执行次数)
增加计数值:可以考虑前一天、前一星期或者其他时间段的点击技术,并基于时间段的长短给予不同的权重
使用第二价格拍卖 (second-price auction) 的方式来决定广告位的费用
给予低价广告一定曝光量:部分时间内,获取收益排名前 100 的广告,基于它们的 eCPM 的相对值来挑选广告,而不是挑选 eCPM 最高的广告
优化新广告初始 eCPM :
初期使用同类型广告的平均点击数据