排名评估 API编辑

允许您评估一组典型搜索查询的排名搜索结果的质量。

请求编辑

GET /<target>/_rank_eval

POST /<target>/_rank_eval

先决条件编辑

  • 如果启用了 Elasticsearch 安全功能,则您必须对目标数据流、索引或别名具有 read 索引权限

描述编辑

排名评估 API 允许您评估一组典型搜索查询的排名搜索结果的质量。给定这组查询和手动评分的文档列表,_rank_eval 端点会计算并返回典型的信息检索指标,例如*平均倒数排名*、*精度*或*折现累积增益*。

搜索质量评估首先要查看搜索应用程序的用户以及他们正在搜索的内容。用户有特定的*信息需求*;例如,他们在网上商店中寻找礼物,或者想预订下次度假的航班。他们通常会在搜索框或其他一些 Web 表单中输入一些搜索词。所有这些信息,连同有关用户的元信息(例如浏览器、位置、早期偏好等),然后会被转换为对底层搜索系统的查询。

搜索工程师面临的挑战是调整从用户输入到具体查询的转换过程,以便搜索结果包含与用户的信息需求相关的最相关信息。这只有在针对典型的用户查询的代表性测试套件不断评估搜索结果质量时才能实现,这样才能确保对一个特定查询排名的改进不会对其他类型查询的排名产生负面影响。

为了开始进行搜索质量评估,您需要三个基本要素

  1. 您要根据其评估查询性能的文档集合,通常是一个或多个数据流或索引。
  2. 用户输入到您的系统中的一组典型搜索请求。
  3. 一组文档评分,表示文档与搜索请求的相关性。

重要的是要注意,每个测试查询都需要一组文档评分,并且相关性判断基于输入查询的用户的需求。

排名评估 API 提供了一种便捷的方式,可以在排名评估请求中使用此信息来计算不同的搜索评估指标。这使您可以初步估计整体搜索质量,以及在微调应用程序中查询生成的各个方面时优化的指标。

路径参数编辑

<target>
(可选,字符串)用于限制请求的数据流、索引和别名的逗号分隔列表。支持通配符 (*)。要定位所有数据流和索引,请省略此参数或使用 *_all

查询参数编辑

allow_no_indices

(可选,布尔值)如果为 false,则如果任何通配符表达式、索引别名_all 值仅定位到缺少或关闭的索引,则请求将返回错误。即使请求定位到其他打开的索引,此行为也适用。例如,如果索引以 foo 开头但没有索引以 bar 开头,则定位到 foo*,bar* 的请求将返回错误。

默认为 true

expand_wildcards

(可选,字符串)通配符模式可以匹配的索引类型。如果请求可以定位数据流,则此参数确定通配符表达式是否匹配隐藏数据流。支持逗号分隔的值,例如 open,hidden。有效值为

all
匹配任何数据流或索引,包括隐藏的数据流或索引。
open
匹配打开的、非隐藏的索引。也匹配任何非隐藏的数据流。
closed
匹配关闭的、非隐藏的索引。也匹配任何非隐藏的数据流。数据流不能关闭。
hidden
匹配隐藏的数据流和隐藏的索引。必须与 openclosed 或两者结合使用。
none
不接受通配符模式。

默认为 open

ignore_unavailable
(可选,布尔值)如果为 false,则如果请求定位到缺少或关闭的索引,则请求将返回错误。默认为 false

示例编辑

在最基本的形式中,对 _rank_eval 端点的请求有两个部分

GET /my-index-000001/_rank_eval
{
  "requests": [ ... ],                            
  "metric": {                                     
    "mean_reciprocal_rank": { ... }               
  }
}

一组典型的搜索请求,以及它们提供的评分

要计算的评估指标的定义

特定指标及其参数

请求部分包含几个典型的应用程序搜索请求,以及每个特定搜索请求的文档评分。

GET /my-index-000001/_rank_eval
{
  "requests": [
    {
      "id": "amsterdam_query",                                  
      "request": {                                              
          "query": { "match": { "text": "amsterdam" } }
      },
      "ratings": [                                              
        { "_index": "my-index-000001", "_id": "doc1", "rating": 0 },
        { "_index": "my-index-000001", "_id": "doc2", "rating": 3 },
        { "_index": "my-index-000001", "_id": "doc3", "rating": 1 }
      ]
    },
    {
      "id": "berlin_query",
      "request": {
        "query": { "match": { "text": "berlin" } }
      },
      "ratings": [
        { "_index": "my-index-000001", "_id": "doc1", "rating": 1 }
      ]
    }
  ]
}

搜索请求的 ID,用于稍后对结果详细信息进行分组。

正在评估的查询。

文档评分列表。每个条目都包含以下参数

  • _index:文档的索引。对于数据流,这应该是文档的支持索引。
  • _id:文档 ID。
  • rating:文档与此搜索请求的相关性。

文档 rating 可以是任何整数值,用于表示文档在用户定义的比例上的相关性。对于某些指标,只需给出二进制评分(例如,0 表示不相关,1 表示相关)就足够了,而其他指标可以使用更细粒度的比例。

基于模板的排名评估编辑

作为必须为每个测试请求提供单个查询的替代方法,可以在评估请求中指定查询模板,并在以后引用它们。这样,结构相似但参数不同的查询就不必在 requests 部分中重复出现。在典型的搜索系统中,用户输入通常会被填充到一小部分查询模板中,这有助于使评估请求更加简洁。

GET /my-index-000001/_rank_eval
{
   [...]
  "templates": [
     {
        "id": "match_one_field_query",  
        "template": { 
            "inline": {
                "query": {
                  "match": { "{{field}}": { "query": "{{query_string}}" }}
                }
            }
        }
     }
  ],
  "requests": [
      {
         "id": "amsterdam_query",
         "ratings": [ ... ],
         "template_id": "match_one_field_query", 
         "params": { 
            "query_string": "amsterdam",
            "field": "text"
          }
     },
    [...]
}

模板 ID

要使用的模板定义

对先前定义的模板的引用

用于填充模板的参数

您也可以使用存储的搜索模板

GET /my_index/_rank_eval
{
   [...]
  "templates": [
     {
        "id": "match_one_field_query",  
        "template": { 
            "id": "match_one_field_query"
        }
     }
  ],
  "requests": [...]
}

用于请求的模板 ID

存储在集群状态中的模板 ID

可用的评估指标编辑

metric 部分确定将使用哪些可用的评估指标。支持以下指标

K 精度 (P@k)编辑

此指标衡量前 k 个搜索结果中相关结果的比例。它是众所周知的精度指标的一种形式,该指标仅查看前 k 个文档。它是前 k 个结果中相关文档的比例。10 精度 (P@10) 值为 0.6 表示 10 个热门结果中有 6 个与用户的信息需求相关。

P@k 作为一种简单的评估指标效果很好,其优点是易于理解和解释。集合中的文档需要根据当前查询评定为相关或不相关。P@k 是一种基于集合的指标,它不考虑前 k 个结果中相关文档的位置,因此,在位置 10 处包含一个相关结果的 10 个结果的排名与在位置 1 处包含一个相关结果的 10 个结果的排名一样好。

response = client.rank_eval(
  index: 'my-index-000001',
  body: {
    requests: [
      {
        id: 'JFK query',
        request: {
          query: {
            match_all: {}
          }
        },
        ratings: []
      }
    ],
    metric: {
      precision: {
        k: 20,
        relevant_rating_threshold: 1,
        ignore_unlabeled: false
      }
    }
  }
)
puts response
GET /my-index-000001/_rank_eval
{
  "requests": [
    {
      "id": "JFK query",
      "request": { "query": { "match_all": {} } },
      "ratings": []
    } ],
  "metric": {
    "precision": {
      "k": 20,
      "relevant_rating_threshold": 1,
      "ignore_unlabeled": false
    }
  }
}

precision 指标采用以下可选参数

参数 描述

k

设置每个查询检索的最大文档数。此值将代替查询中的常用 size 参数。默认为 10。

relevant_rating_threshold

设置评分阈值,高于此阈值的文档将被视为“相关”。默认为 1

ignore_unlabeled

控制如何计算搜索结果中未标记的文档。如果设置为 *true*,则忽略未标记的文档,并且既不计为相关也不计为不相关。设置为 *false*(默认值),则将它们视为不相关。

K 召回率 (R@k)编辑

此指标衡量前 k 个搜索结果中相关结果的总数。它是众所周知的召回率指标的一种形式。它是前 k 个结果中相关文档相对于所有可能相关文档的比例。10 召回率 (R@10) 值为 0.5 表示在 10 个热门结果中检索到了 8 个与用户的信息需求相关的文档中的 4 个。

R@k 作为一种简单的评估指标效果很好,其优点是易于理解和解释。集合中的文档需要根据当前查询评定为相关或不相关。R@k 是一种基于集合的指标,它不考虑前 k 个结果中相关文档的位置,因此,在位置 10 处包含一个相关结果的 10 个结果的排名与在位置 1 处包含一个相关结果的 10 个结果的排名一样好。

response = client.rank_eval(
  index: 'my-index-000001',
  body: {
    requests: [
      {
        id: 'JFK query',
        request: {
          query: {
            match_all: {}
          }
        },
        ratings: []
      }
    ],
    metric: {
      recall: {
        k: 20,
        relevant_rating_threshold: 1
      }
    }
  }
)
puts response
GET /my-index-000001/_rank_eval
{
  "requests": [
    {
      "id": "JFK query",
      "request": { "query": { "match_all": {} } },
      "ratings": []
    } ],
  "metric": {
    "recall": {
      "k": 20,
      "relevant_rating_threshold": 1
    }
  }
}

recall 指标采用以下可选参数

参数 描述

k

设置每个查询检索的最大文档数。此值将代替查询中的常用 size 参数。默认为 10。

relevant_rating_threshold

设置评分阈值,高于此阈值的文档将被视为“相关”。默认为 1

平均倒数排名编辑

对于测试套件中的每个查询,此指标都会计算第一个相关文档的排名的倒数。例如,在位置 3 找到第一个相关结果意味着倒数排名为 1/3。每个查询的倒数排名在测试套件中的所有查询中取平均值,以得出平均倒数排名

response = client.rank_eval(
  index: 'my-index-000001',
  body: {
    requests: [
      {
        id: 'JFK query',
        request: {
          query: {
            match_all: {}
          }
        },
        ratings: []
      }
    ],
    metric: {
      mean_reciprocal_rank: {
        k: 20,
        relevant_rating_threshold: 1
      }
    }
  }
)
puts response
GET /my-index-000001/_rank_eval
{
  "requests": [
    {
      "id": "JFK query",
      "request": { "query": { "match_all": {} } },
      "ratings": []
    } ],
  "metric": {
    "mean_reciprocal_rank": {
      "k": 20,
      "relevant_rating_threshold": 1
    }
  }
}

mean_reciprocal_rank 指标采用以下可选参数

参数 描述

k

设置每个查询检索的最大文档数。此值将代替查询中的常用 size 参数。默认为 10。

relevant_rating_threshold

设置评级阈值,高于此阈值的文档将被视为“相关”。默认为 1

折扣累积增益 (DCG)编辑

与上述两个指标相比,折扣累积增益 同时考虑了搜索结果的排名和评级。

假设高度相关的文档出现在结果列表的顶部对用户更有用。因此,DCG 公式减少了排名较低的文档的高评分对整体 DCG 指标的贡献。

response = client.rank_eval(
  index: 'my-index-000001',
  body: {
    requests: [
      {
        id: 'JFK query',
        request: {
          query: {
            match_all: {}
          }
        },
        ratings: []
      }
    ],
    metric: {
      dcg: {
        k: 20,
        normalize: false
      }
    }
  }
)
puts response
GET /my-index-000001/_rank_eval
{
  "requests": [
    {
      "id": "JFK query",
      "request": { "query": { "match_all": {} } },
      "ratings": []
    } ],
  "metric": {
    "dcg": {
      "k": 20,
      "normalize": false
    }
  }
}

dcg 指标采用以下可选参数

参数 描述

k

设置每个查询检索的最大文档数。此值将代替查询中的常用 size 参数。默认为 10。

normalize

如果设置为 true,则此指标将计算 归一化 DCG

预期倒数排名 (ERR)编辑

预期倒数排名 (ERR) 是经典倒数排名在分级相关性情况下的扩展(Olivier Chapelle、Donald Metzler、Ya Zhang 和 Pierre Grinspan,2009 年 1 月。分级相关性的预期倒数排名。)

它基于搜索级联模型的假设,在该模型中,用户按顺序浏览排名的搜索结果,并在满足信息需求的第一个文档处停止。因此,它是问答和导航查询的一个很好的指标,但对于用户有兴趣在 top k 结果中找到许多相关文档的调查导向型信息需求则不太适用。

该指标对用户停止阅读结果列表的位置的倒数的期望进行建模。这意味着排名靠前的相关文档将对整体得分有很大贡献。但是,如果同一文档出现在较低的排名,则它对得分的贡献要小得多;如果它前面有一些相关(但可能不太相关)的文档,则更是如此。通过这种方式,ERR 指标会对显示在非常相关的文档之后的文档进行折扣。这在相关文档的排序中引入了例如 Precision 或 DCG 未考虑到的依赖性概念。

response = client.rank_eval(
  index: 'my-index-000001',
  body: {
    requests: [
      {
        id: 'JFK query',
        request: {
          query: {
            match_all: {}
          }
        },
        ratings: []
      }
    ],
    metric: {
      expected_reciprocal_rank: {
        maximum_relevance: 3,
        k: 20
      }
    }
  }
)
puts response
GET /my-index-000001/_rank_eval
{
  "requests": [
    {
      "id": "JFK query",
      "request": { "query": { "match_all": {} } },
      "ratings": []
    } ],
  "metric": {
    "expected_reciprocal_rank": {
      "maximum_relevance": 3,
      "k": 20
    }
  }
}

expected_reciprocal_rank 指标采用以下参数

参数 描述

maximum_relevance

必填参数。用户提供的相关性判断中使用的最高相关性等级。

k

设置每个查询检索的最大文档数。此值将代替查询中的常用 size 参数。默认为 10。

响应格式编辑

_rank_eval 端点的响应包含为定义的质量指标计算的整体结果、包含测试套件中每个查询的结果细分的 details 部分,以及显示单个查询的潜在错误的可选 failures 部分。响应采用以下格式

{
  "rank_eval": {
    "metric_score": 0.4,                          
      "details": {
      "my_query_id1": {                           
        "metric_score": 0.6,                      
        "unrated_docs": [                         
          {
            "_index": "my-index-000001",
            "_id": "1960795"
          }, ...
        ],
        "hits": [
          {
            "hit": {                              
              "_index": "my-index-000001",
              "_type": "page",
              "_id": "1528558",
              "_score": 7.0556192
            },
            "rating": 1
          }, ...
        ],
        "metric_details": {                       
          "precision": {
            "relevant_docs_retrieved": 6,
            "docs_retrieved": 10
          }
        }
      },
      "my_query_id2": { [... ] }
    },
    "failures": { [... ] }
  }
}

由定义的指标计算的整体评估质量

details 部分包含原始 requests 部分中每个查询的一个条目,由搜索请求 ID 作为键

details 部分中的 metric_score 显示此查询对全局质量指标得分的贡献

unrated_docs 部分包含此查询的搜索结果中没有评级值的每个文档的 _index_id 条目。这可用于要求用户提供这些文档的评级

hits 部分显示搜索结果及其提供的评级的分组

metric_details 提供有关计算的质量指标的附加信息(例如,检索到的文档中有多少是相关的)。内容因指标而异,但可以更好地解释结果