【问题标题】:How to compute scores from script_fields in elasticsearch?如何从弹性搜索中的 script_fields 计算分数?
【发布时间】:2015-09-20 23:57:33
【问题描述】:

我正在使用“script_fields”生成自定义字段。我想使用该字段为文档生成分数。如何在弹性搜索中实现这一点。如果有人可以发布示例查询,那就太好了。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    这实际上是不可能的,因为在计算文档的分数时,尚未计算脚本字段值。搜索请求通常分两个阶段执行:queryfetch。在 查询 阶段计算分数并选择最热门的文档进行检索。然后在 fetch 阶段使用顶部文档的列表来检索文档。在此检索过程中,将计算脚本字段。

    换句话说,为了使用脚本对文档进行评分,您需要在 query 阶段使用此脚本,例如将其放入function_score 查询中,例如

    【讨论】:

    • 那么,如何从 function_score 查询中获取中间返回值并将它们与结果一起返回? ;)
    • @GabeKopley 除非 1)这些值是实际命中分数或 2)您想将脚本实现为 java 插件(AKA 本机脚本)并将这些中间值自己存储在一些静态中,否则这是不可能的地图。根本没有脚本可以在阶段之间“存储”这些中间值的地方。阶段之间唯一保留的信息是分数和排序键。
    • 谢谢@imotov。而且我们不能返回任意数量的分数,只能返回一个分数,对吧? (这就是所有文档的建议)。
    • @GabeKopley 正确,每次点击只能有一个分数。不过,它可以有任意数量的排序键。因此,如果您将脚本从 functions_score 移动到排序,您将有更大的灵活性。如果潜在的好处值得增加复杂性,我会建议三思而后行。排序脚本针对每个搜索结果(可能是数百万条记录)执行,字段脚本仅针对您检索的记录(通常为 10 条)执行。因此,在大多数情况下,重新计算脚本字段中的值的开销应该是最小的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多