重排序任务在搜索、推荐领域已有不少研究工作和落地实践,核心解决的问题是从 N 个结果候选中,生成 Top-K 个结果的排列。
用户直接的交互行为序列(曝光、点击等)
当我们查询 ES 以获取要提供的推荐时,我们需要发送要跳过的用户列表。例如,您最近见过的用户和您已经匹配的用户不应再向您推荐。对于非常活跃的用户,此跳过列表可能相当高。我们在 ES 上使用术语查询作为跳过列表。。通过利用评分函数来处理跳过,我们能够支持更复杂的逻辑向前发展,只要信息/逻辑通过查询参数传递。
我们最感兴趣的插件类型是脚本引擎或脚本插件。这种类型的插件允许我们自定义为文档完成相关性分配的方式。
搜索服务中,有大量数据会被几乎每一次请求访问,比如用户画像、商品信息、社区动态信息、倒排池等,这些数据的共同特点是对一致性容忍度较高,且大多有明显的热点。
为了更小RT与更高可用性,搜索服务大量使用了本地缓存做这些数据的一级缓存,Redis 与 ElasticSearch 作为二级缓存。
当您需要执行模糊搜索或有排名的结果时。索引是使用预定义数量的分片创建的。更多分片需要迁移到新索引。通常使用ReIndex API(https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html)完成
基于我们定期下载的 Google Analytics 综合浏览量,归一化为 1 到 0 之间的浮点数。在编写评分函数时,它会执行如下操作:
rank = doc.popularity * 10 + search.score
这似乎产生了相当合理的结果。
但“匹配度”还不止于此。Elasticsearch 有自己的 API 来定义提升,我们的应用方式是:
- 中的匹配短语
title
:Boost = 10.0 - 中的匹配短语
body
:Boost = 5.0 - 匹配
title
:Boost = 2.0 - 匹配
body
:Boost = 1.0
然后将其应用于 Elasticsearch 所做的任何其他事情之上,例如“词频”和“逆向文档频率”(tf 和 if)。这篇文章是一个有用的介绍。
我们很可能还没有完成这个。我们可能还可以做很多事情来调整无数的旋钮和滑块,以获得匹配文档的最佳排名。
模型训练:
在对数据集应用成对变换后,通过训练逻辑回归模型来解决优化问题很简单,可以使用许多现成的库。
我们专门使用了scikit-learn。
训练模型时要记住的另一件事是将系数的值限制为非负值,因为在 Elasticsearch 提升值中不能为负值
图 4:当搜索服务收到查询时,“召回阶段”负责检索与消费者意图相关的文档,“精确阶段”(或“排序阶段”)对文档重新排序以最好地满足消费者的意图.
How to Reindex One Billion Documents in One Hour at SoundCloud
How We Improved Our Performance Using ElasticSearch Plugins: Part 2
搜索引擎分布式系统思考实践 | 得物技术
得物榜单|全链路生产迁移及B/C端数据存储隔离
5 Database technologies used by 2000 Wix microservices