【问题标题】:Elasticsearch: Learning from clicks (Search result ranking)Elasticsearch:从点击中学习(搜索结果排名)
【发布时间】:2014-12-30 02:48:00
【问题描述】:

我阅读了Programming Collective Intelligence 一书中的“从点击中学习”一章并喜欢这个想法:那里的搜索引擎会了解用户点击了哪些结果,并使用这些信息来提高结果的排名。

如果我可以从用户点击中学习,我认为这将大大提高我的 Java/Elasticsearch 应用程序中搜索排名的质量。

在书中,他们构建了一个multiplayer perceptron (MLP) network 以将学习到的信息用于新的搜索短语。他们使用 Python 和 SQL 数据库来计算搜索排名。

是否有人已经使用 Elasticsearch 实现了类似的功能,或者知道示例项目? 如果我可以直接在 Elasticsearch 中管理点击信息而不需要额外的 SQL 数据库,那就太好了。

【问题讨论】:

  • 你有什么问题?
  • 是否有人已经使用 Elasticsearch 实现了类似的功能或知道示例项目?
  • 我已经实现了一个这样的项目
  • 好的 ;-),我明白了,我应该改进我的问题的措辞。您能否分享项目的源代码、架构或 Elasticsearch 架构作为答案?您是否在不使用其他数据库的情况下实现了它?您如何存储点击次数?是否已经有实现该算法的公共 Java/Elasticsearch 解决方案(我认为,通过点击学习并不是一个很少需要的功能)?

标签: java search elasticsearch machine-learning relevance


【解决方案1】:

您需要做的是将有关点击的信息存储在 Elasticsearch 索引内的字段中。每次单击都会导致文档更新。由于更新操作实际上是删除和插入Update API,因此您需要确保文档文本已存储,而不仅仅是索引。然后,您可以使用Function Score Query 构建反映存储在索引中的值的评分函数。

或者,您可以将信息存储在单独的数据库中,并使用 score 函数中的 脚本 函数来访问数据库。由于性能问题,我不建议使用此解决方案。

【讨论】:

  • 感谢您的提示,但我认为功能分数查询功能不够强大,因为您只能访问一个文档的字段。我的用例的分数查询示例对我很有帮助。
【解决方案2】:

我明白你的问题的重点。您想在 Elasticsearch 框架中构建学习排名模型。每个文档与查询的相关性是在线计算的。您想结合查询和文档来计算分数,因此需要一个自定义函数来计算 _score。我是 elasticsearch 新手,正在寻找解决问题的方法。

Lucene 是一个更通用的搜索引擎,它可以定义您自己的评分器来计算相关性,我之前已经开发了几个应用程序。

这个article 描述了自定义得分手的信念理解。但是,在elasticsearch上,我没有找到相关的文章。欢迎和我一起讨论你在elasticsearch上的进展。

【讨论】:

    【解决方案3】:

    在信息检索领域(搜索和推荐的一般学术领域),这通常被称为Learning to Rank。无论是点击、转化还是其他形式的关键字搜索“好”或“坏”结果的判断,学习排名都使用分类器或回归过程来了解查询和文档的哪些特征与相关性相关。

    点击次数?

    对于点击次数,我们有理由怀疑优化点击次数是否理想。我正在尝试挖掘微软研究院的一篇论文,声称在他们的案例中,点击与相关性的相关性仅为 45%。 Click+dwell 通常是一种更有用的通用相关性指标。

    在我谈到in this blog article 时,搜索中也存在自我强化偏见的风险。如果您已经向用户展示了平庸的结果,并且他们继续点击这些平庸的结果,那么您最终可能会加强搜索以继续向用户展示平庸的结果。

    除了点击次数之外,对于您应该衡量的内容,通常还有针对特定领域的考虑因素。例如,在电子商务中,转换很重要。也许导致此类购买的搜索结果点击应该更重要。 Netflix 著名地试图弄清楚当你看电影 5 分钟然后回到菜单而不是 30 分钟然后退出时这意味着什么。一些搜索用例是信息性的:当您研究并单击许多搜索结果与您购买单个商品时,单击可能意味着不同。

    很抱歉,这不是灵丹妙药。我听说过许多尝试学习排名的成功和不成功的尝试,这主要归结为您在衡量用户认为相关的内容方面有多成功。这个问题的难度让很多人感到惊讶。le

    对于 Elasticsearch...

    对于 Elasticsearch,有 this plugin(免责声明我是作者)。这是documented here。一旦你弄清楚如何为特定查询(无论是点击次数还是更多)“评分”文档,你就可以训练一个模型,然后通过这个插件将其输入 Elasticsearch 以进行排名。

    【讨论】:

    • 哇,谢谢,很有趣。三年后,我的应用程序中仍然没有 Learning-to-rank-search ;-)。该插件看起来很有前途。
    • 道格,这会重新排名吗?或者它是否对索引中的所有文档进行评分?对于使用 xgboost 模型对所有记录进行评分的巨大索引而言,计算量似乎相当大。然而,重新排名似乎更可行。你能谈谈吗?
    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2011-09-01
    • 2012-10-19
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多