全部产品

基础排序

更新时间:2020-09-11 12:15:04

基础排序即是海选,从检索结果中快速找到质量高的文档,取出TOP N个结果再按照业务排序进行精细算分,最终返回最优的结果给用户。由此可见,基础排序对性能影响比较大,业务排序对最终排序效果影响比较大。因此,基础排序要求尽量简单有效,只提取业务排序中的关键因子即可。同时,基础排序与业务排序目前均通过排序表达式的方式进行配置。
排序表达式(Ranking Formula)允许用户为应用自定义搜索结果排序方式,通过在查询请求中指定表达式来对结果排序。排序表达式支持基本运算(算术运算、关系运算、逻辑运算、位运算、条件运算)、数学函数和排序特征(feature)等。Open Search对于几种经典的应用(如论坛、资讯等)提供了表达式模板,用户可根据自己数据的特点,选择合适的表达式模板,并以此为基础进行修改,生成自己的表达式。
下文将介绍基础排序中支持的排序特征函数项,以及流程演示。

注意:排序表达式中一律使用 数值或数值字段类型 参与基本运算操作,例如算数,关系,逻辑,条件等运算操作,大部分函数都不支持字符串类型进行运算。

排序特征函数项

static_bm25 : 静态文本相关性,用于衡量query与文档的匹配度

  1. 详细用法
    static_bm25()
  2. 参数

  3. 返回值
    float,值域为[0,1]
  4. 适用场景
    场景1:在基础排序的表达式中指定文本分;
    表达式中设置:static_bm25()
  5. 注意事项
    • 默认基础排序default中即会生效static_bm25()

exact_match_boost :获取查询中用户指定的查询词权重最大值

  1. 详细用法
    exact_match_boost()
  2. 参数

  3. 返回值
    int,值域为[0, 99]
  4. 适用场景
    场景1:查询为query=default:’开放搜索’^60 OR default:’opensearch’^50,希望按照实际匹配词boost权重来排序。如如果文档A包含“开放搜索”,文档B包含“opensearch”,则文档A排到文档B前面。
    基础排序表达式为:exact_match_boost()
  5. 注意事项
    • 函数参数依赖字段需创建为索引
    • 如果对于没有指定boost的查询词默认boost值为99。

timeliness : 时效分,用于衡量文档的新旧程度

  1. 详细用法
    timeliness(pubtime)
  2. 参数
    pubtime:要评估的字段,类型必须为int,单位为秒
  3. 返回值
    float,值域为[0,1],值越大表示时效性越好。若大于当前时间则返回0。
  4. 适用场景
    场景1:在基础排序中指定create_timestamp字段的时效性;
    表达式中设置:timeliness(create_timestamp)
  5. 注意事项
    • pubtime字段必须配置为属性字段。

timeliness_ms : 时效分,用于衡量文档的新旧程度

  1. 详细用法
    timeliness_ms(pubtime)
  2. 参数
    pubtime:要评估的字段,类型必须为int,单位为毫秒
  3. 返回值
    float,值域为[0,1],值越大表示时效性越好。若大于当前时间则返回0。
  4. 适用场景
    场景1:在基础排序中指定create_timestamp字段的时效性;
    表达式中设置:timeliness_ms(create_timestamp)
  5. 注意事项
    • pubtime字段必须配置为属性字段。

normalize :归一化函数,根据不同的算分将数值归一化至[0, 1]

  1. 场景概述
    相关性计算过程中,一篇doc的好坏需要从不同的维度衡量。而各个维度的分数值域可能不同,比如网页点击数可能是成百上千万,网页的文本相关性分数在[0, 1]之间,它们之间没有可比性。为了在公式中使用这些元素,需要将不同的分数归一化至同一个值域区间,而normalize为这种归一化提供了一种简便的方法。normlize支持三种归一化方法:线性函数转化、对数函数转化、反正切函数转化。根据传入参数的不同,normalize自动选择不同的归一化方法。如果只指定value参数,normalize使用反正切函数转化,如果指定了value和max参数,normalize使用对数函数转化,如果指定了value、max和min,normalize使用线性函数转化。
  2. 详细用法:
    normalize(value, max, min)
  3. 参数
    value:需要做归一化的值,支持double类型的浮点数,该值可以来自文档中的字段或者其他表达式
    max:value的最大值,可选,支持double类型的浮点数
    min:value的最小值,可选,支持double类型的浮点数
  4. 返回值
    double,[0, 1]之间的值。
  5. 适用场景
    场景1:对price字段做归一化,但是不知道price的值域,可以使用如下公式进行归一化
    normalize(price)
    场景2:对price字段做归一化,但是只知道price的最大值为100,可以使用如下公式进行归一化
    normalize(price, 100)
    场景3:对price字段做归一化,并且知道price的最大值为100,最小值为1,可以使用如下公式进行归一化
    normalize(price, 100, 1)
    场景4:将distance函数的结果归一化至[0, 1]
    normalize(distance(longitude_in_doc, latitude_in_doc, longtitude_in_query, latitude_in_query))
  6. 注意事项:
    • 函数参数需创建为属性
    • 使用反正切函数进行归一化时,如果value小于0,归一化后的值为0
    • 使用对数函数进行归一化时,max的值要大于1
    • 使用线性函数进行归一化时,max要大于min

category_score:类目预测函数,返回参数中指定的类目字段与类目预测query的类目匹配分

  1. 详细用法

    category_score(cate_id)

  2. 参数

    cate_id:训练时作为类目id的字段,类型必须为int。

  3. 返回值
    float,值域为[0,2]。

  4. 适用场景
    场景1:在基础排序中指定create_timestamp字段的时效性;
    表达式中设置:category_score(cate_id)
  5. 注意事项