API оценки ранжирования
Позволяет оценить качество ранжированных результатов поиска по набору типичных запросов.
Запрос
GET /<target>/_rank_eval
POST /<target>/_rank_eval
Предварительные требования
- Если включены функции безопасности Elasticsearch, у вас должна быть
readправо доступа к индексу для целевого потока данных, индекса или псевдонима.
Описание
API оценки ранжирования позволяет оценить качество ранжированных результатов поиска по набору типичных поисковых запросов. Учитывая этот набор запросов и список вручную оценочных документов, конечная точка _rank_eval рассчитывает и возвращает типичные метрики ретроспективного поиска, такие как средний обратный ранг, точность или скидочная кумулятивная выгода.
Оценка качества поиска начинается с анализа пользователей вашего приложения поиска и того, что они ищут. У пользователей есть конкретная информационная потребность; например, они ищут подарок в интернет-магазине или хотят забронировать перелет на ближайшие каникулы. Обычно они вводят некоторые поисковые термины в поисковую строку или какую-либо другую веб-форму. Вся эта информация вместе с метаданными о пользователе (например, браузер, местоположение, предыдущие предпочтения и так далее) затем преобразуется в запрос к основной поисковой системе.
Задача инженеров по поиску заключается в настройке этого процесса преобразования от ввода пользователя к конкретному запросу таким образом, чтобы результаты поиска содержали наиболее релевантную информацию с учетом информационной потребности пользователя. Это можно сделать только в том случае, если качество результатов поиска постоянно оценивается по представительному набору типичных запросов пользователей, чтобы улучшения в ранжировании для одного конкретного запроса не ухудшали ранжирование для других типов запросов.
Для начала оценки качества поиска вам потребуются три основных элемента:
- Коллекция документов, по которым вы хотите оценить производительность своих запросов, обычно один или несколько потоков данных или индексов.
- Коллекция типичных поисковых запросов, которые пользователи вводят в вашу систему.
- Набор оценок документов, представляющих релевантность документов в отношении поискового запроса.
Важно отметить, что для каждого тестового запроса требуется один набор оценок документов, и что суждения о релевантности основаны на информационной потребности пользователя, введшего запрос.
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 }
]
}
]
} | Идентификатор поискового запроса, используемый для группировки деталей результатов позже. | |
| Оцениваемый запрос. | |
| Список оценок документов. Каждая запись содержит следующие аргументы:
|
Документ 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"
}
},
[...]
} | идентификатор шаблона | |
| определение используемого шаблона | |
| ссылка на ранее определенный шаблон | |
| параметры для заполнения шаблона |
Вы также можете использовать сохраненный шаблон поиска.
GET /my_index/_rank_eval
{
[...]
"templates": [
{
"id": "match_one_field_query",
"template": {
"id": "match_one_field_query"
}
}
],
"requests": [...]
} | идентификатор шаблона, используемый для запросов | |
| идентификатор шаблона, сохраненный в состоянии кластера |
Доступные метрики оценки
Раздел metric определяет, какие из доступных метрик оценки будут использоваться. Поддерживаются следующие метрики:
Точность при K (P@k)
Эта метрика измеряет долю релевантных результатов в результатах поиска по верхним k позициям. Это форма хорошо известной метрики точности, которая рассматривает только первые k документов. Это отношение релевантных документов к первым k результатам. Значение точности при 10 (P@10) равное 0,6 означает, что 6 из 10 лучших результатов релевантны потребностям пользователя.
P@k хорошо работает в качестве простой метрики оценки, которая проста в понимании и объяснении. Документы в коллекции должны быть оценены как релевантные или нерелевантные по отношению к текущему запросу. P@k — это метрика, основанная на множествах, и не учитывает положение релевантных документов в результатах по верхним k позициям, поэтому рейтинг из десяти результатов с одним релевантным результатом на 10-й позиции так же хорош, как и рейтинг из десяти результатов с одним релевантным результатом на первой позиции.
resp = client.rank_eval(
index="my-index-000001",
requests=[
{
"id": "JFK query",
"request": {
"query": {
"match_all": {}
}
},
"ratings": []
}
],
metric={
"precision": {
"k": 20,
"relevant_rating_threshold": 1,
"ignore_unlabeled": False
}
},
)
print(resp) 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 const response = await client.rankEval({
index: "my-index-000001",
requests: [
{
id: "JFK query",
request: {
query: {
match_all: {},
},
},
ratings: [],
},
],
metric: {
precision: {
k: 20,
relevant_rating_threshold: 1,
ignore_unlabeled: false,
},
},
});
console.log(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 означает, что 4 из 8 релевантных документов, по отношению к потребностям пользователя, были извлечены в 10 лучших результатах.
R@k хорошо работает в качестве простой метрики оценки, которая проста в понимании и объяснении. Документы в коллекции должны быть оценены как релевантные или нерелевантные по отношению к текущему запросу. R@k — это метрика, основанная на множествах, и не учитывает положение релевантных документов в результатах по верхним k позициям, поэтому рейтинг из десяти результатов с одним релевантным результатом на 10-й позиции так же хорош, как и рейтинг из десяти результатов с одним релевантным результатом на первой позиции.
resp = client.rank_eval(
index="my-index-000001",
requests=[
{
"id": "JFK query",
"request": {
"query": {
"match_all": {}
}
},
"ratings": []
}
],
metric={
"recall": {
"k": 20,
"relevant_rating_threshold": 1
}
},
)
print(resp) 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 const response = await client.rankEval({
index: "my-index-000001",
requests: [
{
id: "JFK query",
request: {
query: {
match_all: {},
},
},
ratings: [],
},
],
metric: {
recall: {
k: 20,
relevant_rating_threshold: 1,
},
},
});
console.log(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. Средний обратный ранг для каждого запроса вычисляется в среднем по всем запросам в наборе тестов, что дает средний обратный ранг.
resp = client.rank_eval(
index="my-index-000001",
requests=[
{
"id": "JFK query",
"request": {
"query": {
"match_all": {}
}
},
"ratings": []
}
],
metric={
"mean_reciprocal_rank": {
"k": 20,
"relevant_rating_threshold": 1
}
},
)
print(resp) 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 const response = await client.rankEval({
index: "my-index-000001",
requests: [
{
id: "JFK query",
request: {
query: {
match_all: {},
},
},
ratings: [],
},
],
metric: {
mean_reciprocal_rank: {
k: 20,
relevant_rating_threshold: 1,
},
},
});
console.log(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.
resp = client.rank_eval(
index="my-index-000001",
requests=[
{
"id": "JFK query",
"request": {
"query": {
"match_all": {}
}
},
"ratings": []
}
],
metric={
"dcg": {
"k": 20,
"normalize": False
}
},
)
print(resp) 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 const response = await client.rankEval({
index: "my-index-000001",
requests: [
{
id: "JFK query",
request: {
query: {
match_all: {},
},
},
ratings: [],
},
],
metric: {
dcg: {
k: 20,
normalize: false,
},
},
});
console.log(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. Ожидаемый обратный ранг для оценки с градацией.)
Он основан на предположении о каскадной модели поиска, в которой пользователь просматривает упорядоченные результаты поиска и останавливается на первом документе, удовлетворяющем потребности в информации. По этой причине он является хорошей метрикой для запросов, связанных с ответами на вопросы и навигацией, но менее подходит для запросов, ориентированных на опросы, где пользователь заинтересован в поиске многих релевантных документов в результатах по верхним k позициям.
Метрика моделирует ожидание обратного значения позиции, на которой пользователь останавливается при чтении списка результатов. Это означает, что релевантный документ в верхней части ранжирования будет вносить большой вклад в общий балл. Однако тот же документ внесет гораздо меньший вклад в балл, если он появится в нижней части ранжирования; и еще меньше, если ему предшествуют релевантные (возможно, менее релевантные) документы. Таким образом, метрика ERR дисконтирует документы, показанные после очень релевантных документов. Это вводит понятие зависимости в порядке релевантных документов, чего не учитывают, например, точность или DCG.
resp = client.rank_eval(
index="my-index-000001",
requests=[
{
"id": "JFK query",
"request": {
"query": {
"match_all": {}
}
},
"ratings": []
}
],
metric={
"expected_reciprocal_rank": {
"maximum_relevance": 3,
"k": 20
}
},
)
print(resp) 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 const response = await client.rankEval({
index: "my-index-000001",
requests: [
{
id: "JFK query",
request: {
query: {
match_all: {},
},
},
ratings: [],
},
],
metric: {
expected_reciprocal_rank: {
maximum_relevance: 3,
k: 20,
},
},
});
console.log(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": { [... ] }
}
} | общая оценка качества, рассчитанная по заданной метрике | |
| раздел | |
| раздел | |
| раздел | |
| раздел | |
| раздел |
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/search-rank-eval.html