排名特征查询编辑

根据 rank_featurerank_features 字段的数值,提升文档的 相关性评分

rank_feature 查询通常用于 bool 查询的 should 子句中,以便其相关性评分被添加到 bool 查询中的其他评分。

对于 rank_featurerank_features 字段,如果将 positive_score_impact 设置为 false,我们建议参与查询的每个文档都具有此字段的值。否则,如果在 should 子句中使用 rank_feature 查询,它不会为缺少值的文档添加任何评分,但会为包含特征的文档添加一些提升。这与我们想要的结果相反 - 因为我们认为这些特征是负面的,我们希望将包含它们的文档排名低于缺少它们的文档。

function_score 查询或其他更改 相关性评分 的方法不同,rank_feature 查询在 track_total_hits 参数 true 时,会有效地跳过非竞争性命中。这可以显着提高查询速度。

排名特征函数编辑

为了根据排名特征字段计算相关性评分,rank_feature 查询支持以下数学函数

如果您不知道从哪里开始,我们建议使用 saturation 函数。如果没有提供函数,rank_feature 查询默认使用 saturation 函数。

示例请求编辑

索引设置编辑

要使用 rank_feature 查询,您的索引必须包含 rank_featurerank_features 字段映射。要查看如何为 rank_feature 查询设置索引,请尝试以下示例。

创建一个名为 test 的索引,并使用以下字段映射

  • pagerank,一个 rank_feature 字段,用于衡量网站的重要性
  • url_length,一个 rank_feature 字段,包含网站 URL 的长度。在本例中,较长的 URL 与相关性呈负相关,由 positive_score_impact 值为 false 表示。
  • topics,一个 rank_features 字段,包含主题列表以及每个文档与该主题的关联程度。
response = client.indices.create(
  index: 'test',
  body: {
    mappings: {
      properties: {
        pagerank: {
          type: 'rank_feature'
        },
        url_length: {
          type: 'rank_feature',
          positive_score_impact: false
        },
        topics: {
          type: 'rank_features'
        }
      }
    }
  }
)
puts response
PUT /test
{
  "mappings": {
    "properties": {
      "pagerank": {
        "type": "rank_feature"
      },
      "url_length": {
        "type": "rank_feature",
        "positive_score_impact": false
      },
      "topics": {
        "type": "rank_features"
      }
    }
  }
}

将多个文档索引到 test 索引中。

response = client.index(
  index: 'test',
  id: 1,
  refresh: true,
  body: {
    url: 'https://en.wikipedia.org/wiki/2016_Summer_Olympics',
    content: 'Rio 2016',
    pagerank: 50.3,
    url_length: 42,
    topics: {
      sports: 50,
      brazil: 30
    }
  }
)
puts response

response = client.index(
  index: 'test',
  id: 2,
  refresh: true,
  body: {
    url: 'https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix',
    content: 'Formula One motor race held on 13 November 2016',
    pagerank: 50.3,
    url_length: 47,
    topics: {
      sports: 35,
      "formula one": 65,
      brazil: 20
    }
  }
)
puts response

response = client.index(
  index: 'test',
  id: 3,
  refresh: true,
  body: {
    url: 'https://en.wikipedia.org/wiki/Deadpool_(film)',
    content: 'Deadpool is a 2016 American superhero film',
    pagerank: 50.3,
    url_length: 37,
    topics: {
      movies: 60,
      "super hero": 65
    }
  }
)
puts response
PUT /test/_doc/1?refresh
{
  "url": "https://en.wikipedia.org/wiki/2016_Summer_Olympics",
  "content": "Rio 2016",
  "pagerank": 50.3,
  "url_length": 42,
  "topics": {
    "sports": 50,
    "brazil": 30
  }
}

PUT /test/_doc/2?refresh
{
  "url": "https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix",
  "content": "Formula One motor race held on 13 November 2016",
  "pagerank": 50.3,
  "url_length": 47,
  "topics": {
    "sports": 35,
    "formula one": 65,
    "brazil": 20
  }
}

PUT /test/_doc/3?refresh
{
  "url": "https://en.wikipedia.org/wiki/Deadpool_(film)",
  "content": "Deadpool is a 2016 American superhero film",
  "pagerank": 50.3,
  "url_length": 37,
  "topics": {
    "movies": 60,
    "super hero": 65
  }
}

示例查询编辑

以下查询搜索 2016,并根据 pagerankurl_lengthsports 主题提升相关性评分。

GET /test/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "content": "2016"
          }
        }
      ],
      "should": [
        {
          "rank_feature": {
            "field": "pagerank"
          }
        },
        {
          "rank_feature": {
            "field": "url_length",
            "boost": 0.1
          }
        },
        {
          "rank_feature": {
            "field": "topics.sports",
            "boost": 0.4
          }
        }
      ]
    }
  }
}

rank_feature 的顶级参数编辑

field
(必需,字符串) rank_featurerank_features 字段,用于提升 相关性评分
boost

(可选,浮点数) 用于降低或提高 相关性评分 的浮点数。默认值为 1.0

提升值相对于默认值 1.0。提升值在 01.0 之间会降低相关性评分。大于 1.0 的值会提高相关性评分。

saturation

(可选,函数对象) 饱和度函数,用于根据排名特征 field 的值提升 相关性评分。如果没有提供函数,rank_feature 查询默认使用 saturation 函数。有关更多信息,请参见 饱和度

只能提供一个函数 saturationlogsigmoidlinear

log

(可选,函数对象) 对数函数,用于根据排名特征 field 的值提升 相关性评分。有关更多信息,请参见 对数

只能提供一个函数 saturationlogsigmoidlinear

sigmoid

(可选,函数对象) S 型函数,用于根据排名特征 field 的值提升 相关性评分。有关更多信息,请参见 S 型函数

只能提供一个函数 saturationlogsigmoidlinear

linear

(可选,函数对象) 线性函数,用于根据排名特征 field 的值提升 相关性评分。有关更多信息,请参见 线性

只能提供一个函数 saturationlogsigmoidlinear

备注编辑

饱和度编辑

saturation 函数给出的评分等于 S / (S + pivot),其中 S 是排名特征字段的值,pivot 是可配置的枢轴值,因此如果 S 小于枢轴,则结果将小于 0.5,否则大于 0.5。评分始终为 (0,1)

如果排名特征具有负面评分影响,则该函数将计算为 pivot / (S + pivot),当 S 增加时,该函数会减小。

GET /test/_search
{
  "query": {
    "rank_feature": {
      "field": "pagerank",
      "saturation": {
        "pivot": 8
      }
    }
  }
}

如果没有提供 pivot 值,Elasticsearch 会计算一个默认值,该值等于索引中所有排名特征值的近似几何平均值。如果您没有机会训练一个好的枢轴值,我们建议使用此默认值。

GET /test/_search
{
  "query": {
    "rank_feature": {
      "field": "pagerank",
      "saturation": {}
    }
  }
}

对数编辑

log 函数给出的评分等于 log(scaling_factor + S),其中 S 是排名特征字段的值,scaling_factor 是可配置的缩放因子。评分是无界的。

此函数仅支持具有正面评分影响的排名特征。

GET /test/_search
{
  "query": {
    "rank_feature": {
      "field": "pagerank",
      "log": {
        "scaling_factor": 4
      }
    }
  }
}

S 型函数编辑

sigmoid 函数是 saturation 的扩展,它添加了一个可配置的指数。评分计算为 S^exp^ / (S^exp^ + pivot^exp^)。与 saturation 函数一样,pivot 是给出 0.5 评分的 S 值,评分为 (0,1)

exponent 必须为正数,通常在 [0.5, 1] 范围内。应通过训练计算一个好的值。如果您没有机会这样做,我们建议您改用 saturation 函数。

GET /test/_search
{
  "query": {
    "rank_feature": {
      "field": "pagerank",
      "sigmoid": {
        "pivot": 7,
        "exponent": 0.6
      }
    }
  }
}

线性编辑

linear 函数是最简单的函数,它给出的评分等于 S 的索引值,其中 S 是排名特征字段的值。如果排名特征字段的索引使用 "positive_score_impact": true,则其索引值等于 S,并四舍五入以仅保留 9 位有效位以进行精度控制。如果排名特征字段的索引使用 "positive_score_impact": false,则其索引值等于 1/S,并四舍五入以仅保留 9 位有效位以进行精度控制。

GET /test/_search
{
  "query": {
    "rank_feature": {
      "field": "pagerank",
      "linear": {}
    }
  }
}