排名评估 API
编辑排名评估 API编辑
允许您评估一组典型搜索查询的排名搜索结果的质量。
描述编辑
排名评估 API 允许您评估一组典型搜索查询的排名搜索结果的质量。给定这组查询和手动评分的文档列表,_rank_eval
端点会计算并返回典型的信息检索指标,例如*平均倒数排名*、*精度*或*折现累积增益*。
搜索质量评估首先要查看搜索应用程序的用户以及他们正在搜索的内容。用户有特定的*信息需求*;例如,他们在网上商店中寻找礼物,或者想预订下次度假的航班。他们通常会在搜索框或其他一些 Web 表单中输入一些搜索词。所有这些信息,连同有关用户的元信息(例如浏览器、位置、早期偏好等),然后会被转换为对底层搜索系统的查询。
搜索工程师面临的挑战是调整从用户输入到具体查询的转换过程,以便搜索结果包含与用户的信息需求相关的最相关信息。这只有在针对典型的用户查询的代表性测试套件不断评估搜索结果质量时才能实现,这样才能确保对一个特定查询排名的改进不会对其他类型查询的排名产生负面影响。
为了开始进行搜索质量评估,您需要三个基本要素
- 您要根据其评估查询性能的文档集合,通常是一个或多个数据流或索引。
- 用户输入到您的系统中的一组典型搜索请求。
- 一组文档评分,表示文档与搜索请求的相关性。
重要的是要注意,每个测试查询都需要一组文档评分,并且相关性判断基于输入查询的用户的需求。
排名评估 API 提供了一种便捷的方式,可以在排名评估请求中使用此信息来计算不同的搜索评估指标。这使您可以初步估计整体搜索质量,以及在微调应用程序中查询生成的各个方面时优化的指标。
路径参数编辑
-
<target>
- (可选,字符串)用于限制请求的数据流、索引和别名的逗号分隔列表。支持通配符 (
*
)。要定位所有数据流和索引,请省略此参数或使用*
或_all
。
查询参数编辑
-
allow_no_indices
-
(可选,布尔值)如果为
false
,则如果任何通配符表达式、索引别名 或_all
值仅定位到缺少或关闭的索引,则请求将返回错误。即使请求定位到其他打开的索引,此行为也适用。例如,如果索引以foo
开头但没有索引以bar
开头,则定位到foo*,bar*
的请求将返回错误。默认为
true
。 -
expand_wildcards
-
(可选,字符串)通配符模式可以匹配的索引类型。如果请求可以定位数据流,则此参数确定通配符表达式是否匹配隐藏数据流。支持逗号分隔的值,例如
open,hidden
。有效值为-
all
- 匹配任何数据流或索引,包括隐藏的数据流或索引。
-
open
- 匹配打开的、非隐藏的索引。也匹配任何非隐藏的数据流。
-
closed
- 匹配关闭的、非隐藏的索引。也匹配任何非隐藏的数据流。数据流不能关闭。
-
hidden
- 匹配隐藏的数据流和隐藏的索引。必须与
open
、closed
或两者结合使用。 -
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,用于稍后对结果详细信息进行分组。 |
|
正在评估的查询。 |
|
文档评分列表。每个条目都包含以下参数
|
文档 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" } }, [...] }
您也可以使用存储的搜索模板。
可用的评估指标编辑
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
指标采用以下可选参数
参数 | 描述 |
---|---|
|
设置每个查询检索的最大文档数。此值将代替查询中的常用 |
|
设置评分阈值,高于此阈值的文档将被视为“相关”。默认为 |
|
控制如何计算搜索结果中未标记的文档。如果设置为 *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
指标采用以下可选参数
参数 | 描述 |
---|---|
|
设置每个查询检索的最大文档数。此值将代替查询中的常用 |
|
设置评分阈值,高于此阈值的文档将被视为“相关”。默认为 |
平均倒数排名编辑
对于测试套件中的每个查询,此指标都会计算第一个相关文档的排名的倒数。例如,在位置 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
指标采用以下可选参数
参数 | 描述 |
---|---|
|
设置每个查询检索的最大文档数。此值将代替查询中的常用 |
|
设置评级阈值,高于此阈值的文档将被视为“相关”。默认为 |
折扣累积增益 (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
指标采用以下可选参数
参数 | 描述 |
---|---|
|
设置每个查询检索的最大文档数。此值将代替查询中的常用 |
|
如果设置为 |
预期倒数排名 (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
指标采用以下参数
参数 | 描述 |
---|---|
|
必填参数。用户提供的相关性判断中使用的最高相关性等级。 |
|
设置每个查询检索的最大文档数。此值将代替查询中的常用 |
响应格式编辑
_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": { [... ] } } }