ランキング評価API
一連の典型的な検索クエリに対するランク付けされた検索結果の品質を評価することを可能にします。
リクエスト
GET /<target>/_rank_eval
POST /<target>/_rank_eval
前提条件
- Elasticsearchのセキュリティ機能が有効になっている場合、ターゲットデータストリーム、インデックス、またはエイリアスに対して
read
インデックス権限を持っている必要があります。
説明
ランキング評価APIは、一連の典型的な検索クエリに対するランク付けされた検索結果の品質を評価することを可能にします。このクエリのセットと手動で評価されたドキュメントのリストを考慮して、_rank_eval
エンドポイントは、平均逆順位、精度、または割引累積ゲインなどの典型的な情報検索メトリックを計算して返します。
検索品質評価は、検索アプリケーションのユーザーと、彼らが検索しているものを見て始まります。ユーザーには特定の情報ニーズがあります。たとえば、彼らはウェブショップでギフトを探しているか、次の休暇のためにフライトを予約したいと考えています。彼らは通常、検索ボックスや他のウェブフォームにいくつかの検索用語を入力します。このすべての情報は、ユーザーに関するメタ情報(たとえば、ブラウザ、位置、以前の好みなど)とともに、基盤となる検索システムへのクエリに変換されます。
検索エンジニアの課題は、ユーザーの入力から具体的なクエリへのこの翻訳プロセスを調整し、検索結果がユーザーの情報ニーズに関して最も関連性の高い情報を含むようにすることです。これは、特定のクエリのランキングの改善が他のタイプのクエリのランキングに悪影響を及ぼさないように、典型的なユーザークエリの代表的なテストスイート全体で検索結果の品質が常に評価される場合にのみ実現できます。
検索品質評価を開始するには、次の3つの基本的なものが必要です:
- 1. クエリパフォーマンスを評価するために使用するドキュメントのコレクション。通常は1つ以上のデータストリームまたはインデックスです。
- 2. ユーザーがシステムに入力する典型的な検索リクエストのコレクション。
- 3. 検索リクエストに対するドキュメントの関連性を表すドキュメント評価のセット。
テストクエリごとに1セットのドキュメント評価が必要であり、関連性の判断はクエリを入力したユーザーの情報ニーズに基づいていることに注意することが重要です。
ランキング評価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
エンドポイントへのリクエストには2つのセクションがあります:
Js
GET /my-index-000001/_rank_eval
{
"requests": [ ... ],
"metric": {
"mean_reciprocal_rank": { ... }
}
}
提供された評価とともに典型的な検索リクエストのセット | |
計算する評価メトリックの定義 | |
特定のメトリックとそのパラメータ |
リクエストセクションには、アプリケーションに特有のいくつかの検索リクエストと、各特定の検索リクエストのドキュメント評価が含まれています。
Js
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
セクションで繰り返す必要がなくなります。ユーザー入力が通常、小さなセットのクエリテンプレートに埋め込まれる典型的な検索システムでは、評価リクエストをより簡潔にするのに役立ちます。
Js
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 | |
使用するテンプレート定義 | |
以前に定義されたテンプレートへの参照 | |
テンプレートを埋めるために使用するパラメータ |
保存された検索テンプレートを使用することもできます。
Js
GET /my_index/_rank_eval
{
[...]
"templates": [
{
"id": "match_one_field_query",
"template": {
"id": "match_one_field_query"
}
}
],
"requests": [...]
}
リクエストに使用されるテンプレートID | |
クラスタ状態に保存されたテンプレートID |
利用可能な評価メトリック
#### Kにおける精度 (P@k)
このメトリックは、上位kの検索結果における関連結果の割合を測定します。これは、上位kのドキュメントのみを考慮する有名な[精度](https://en.wikipedia.org/wiki/Evaluation_measures_(information_retrieval)#Precision)メトリックの一形態です。P@10の値が0.6である場合、これは上位10件のヒットのうち6件がユーザーの情報ニーズに関連していることを意味します。
P@kは、理解しやすく説明しやすいという利点があるシンプルな評価メトリックとしてうまく機能します。コレクション内のドキュメントは、現在のクエリに関連するか無関係であるかのいずれかとして評価される必要があります。P@kは集合ベースのメトリックであり、上位kの結果内での関連ドキュメントの位置を考慮しないため、位置10に関連結果が1件含まれる10件の結果のランキングは、位置1に関連結果が1件含まれる10件の結果のランキングと同じくらい良いです。
#### Python
``````python
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)
`
Ruby
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
Js
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
}
}
}
| パラメータ | 説明 |
| :-- | :-- |
| `````k````` | クエリごとに取得される最大ドキュメント数を設定します。この値は、通常の`````size`````パラメータの代わりにクエリ内で機能します。デフォルトは10です。 |
| `````relevant_rating_threshold````` | ドキュメントが「関連」と見なされるための評価閾値を設定します。デフォルトは`````1`````です。 |
| `````ignore_unlabeled````` | 検索結果内のラベルのないドキュメントのカウント方法を制御します。_true_に設定すると、ラベルのないドキュメントは無視され、関連性も無関係としてカウントされません。_false_(デフォルト)に設定すると、無関係として扱われます。
#### Kにおける再現率 (R@k)
このメトリックは、上位kの検索結果における関連結果の総数を測定します。これは、有名な[再現率](https://en.wikipedia.org/wiki/Evaluation_measures_(information_retrieval)#Recall)メトリックの一形態です。R@10の値が0.5である場合、これはユーザーの情報ニーズに関連する8件の関連ドキュメントのうち4件が上位10件のヒットで取得されたことを意味します。
R@kは、理解しやすく説明しやすいという利点があるシンプルな評価メトリックとしてうまく機能します。コレクション内のドキュメントは、現在のクエリに関連するか無関係であるかのいずれかとして評価される必要があります。R@kは集合ベースのメトリックであり、上位kの結果内での関連ドキュメントの位置を考慮しないため、位置10に関連結果が1件含まれる10件の結果のランキングは、位置1に関連結果が1件含まれる10件の結果のランキングと同じくらい良いです。
#### Python
``````python
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)
`
Ruby
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
Js
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
}
}
}
| パラメータ | 説明 |
| :-- | :-- |
| `````k````` | クエリごとに取得される最大ドキュメント数を設定します。この値は、通常の`````size`````パラメータの代わりにクエリ内で機能します。デフォルトは10です。 |
| `````relevant_rating_threshold````` | ドキュメントが「関連」と見なされるための評価閾値を設定します。デフォルトは`````1`````です。 |
#### 平均逆順位
テストスイート内の各クエリに対して、このメトリックは最初の関連ドキュメントの順位の逆数を計算します。たとえば、位置3で最初の関連結果を見つけると、逆順位は1/3になります。各クエリの逆順位は、テストスイート内のすべてのクエリにわたって平均化され、[平均逆順位](https://en.wikipedia.org/wiki/Mean_reciprocal_rank)が得られます。
#### Python
``````python
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)
`
Ruby
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
Js
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
}
}
}
| パラメータ | 説明 |
| :-- | :-- |
| `````k````` | クエリごとに取得される最大ドキュメント数を設定します。この値は、通常の`````size`````パラメータの代わりにクエリ内で機能します。デフォルトは10です。 |
| `````relevant_rating_threshold````` | ドキュメントが「関連」と見なされるための評価閾値を設定します。デフォルトは`````1`````です。 |
#### 割引累積ゲイン (DCG)
上記の2つのメトリックとは対照的に、[割引累積ゲイン](https://en.wikipedia.org/wiki/Discounted_cumulative_gain)は、検索結果の順位と評価の両方を考慮に入れます。
関連性の高いドキュメントは、結果リストの上部に表示されるとユーザーにとってより有用であるという仮定に基づいています。したがって、DCGの公式は、低い検索順位のドキュメントに対する高い評価の寄与を全体のDCGメトリックに対して減少させます。
#### Python
``````python
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)
`
Ruby
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
Js
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
}
}
}
| パラメータ | 説明 |
| :-- | :-- |
| `````k````` | クエリごとに取得される最大ドキュメント数を設定します。この値は、通常の`````size`````パラメータの代わりにクエリ内で機能します。デフォルトは10です。 |
| `````normalize````` | `````true`````に設定すると、このメトリックは[正規化DCG](https://en.wikipedia.org/wiki/Discounted_cumulative_gain#Normalized_DCG)を計算します。 |
#### 期待される逆順位 (ERR)
期待される逆順位 (ERR) は、グレード付き関連性の場合の古典的な逆順位の拡張です(Olivier Chapelle、Donald Metzler、Ya Zhang、Pierre Grinspan。2009年1月。[グレード付き関連性のための期待される逆順位](https://www.researchgate.net/publication/220269787_Expected_reciprocal_rank_for_graded_relevance)。)
これは、ユーザーが順位付けされた検索結果を順番にスキャンし、情報ニーズを満たす最初のドキュメントで停止するというカスケードモデルの仮定に基づいています。このため、質問応答やナビゲーションクエリに対しては良いメトリックですが、ユーザーが上位kの結果で多くの関連ドキュメントを見つけることに興味がある調査指向の情報ニーズにはあまり適していません。
このメトリックは、ユーザーが結果リストを読み進めるのを停止する位置の逆数の期待値をモデル化します。これは、上位のランキング位置にある関連ドキュメントが全体のスコアに大きな寄与を持つことを意味します。しかし、同じドキュメントが低い順位に表示される場合、そのスコアへの寄与ははるかに少なくなります。さらに、前にいくつかの関連(しかしおそらく関連性の低い)ドキュメントがある場合は、さらに少なくなります。このようにして、ERRメトリックは非常に関連性の高いドキュメントの後に表示されるドキュメントを割引します。これは、PrecisionやDCGが考慮しない関連ドキュメントの順序における依存関係の概念を導入します。
#### Python
``````python
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)
`
Ruby
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
Js
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
}
}
}
| パラメータ | 説明 |
| :-- | :-- |
| `````maximum_relevance````` | 必須パラメータ。ユーザーが提供した関連性判断で使用される最高の関連性グレード。 |
| `````k````` | クエリごとに取得される最大ドキュメント数を設定します。この値は、通常の`````size`````パラメータの代わりにクエリ内で機能します。デフォルトは10です。 |
### レスポンス形式
`````_rank_eval`````エンドポイントのレスポンスには、定義された品質メトリックの全体的な計算結果、テストスイート内の各クエリの結果の内訳を含む`````details`````セクション、および個々のクエリの潜在的なエラーを示すオプションの`````failures`````セクションが含まれます。レスポンスは次の形式を持ちます:
#### Js
``````js
{
"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 セクション内の各クエリに対して1つのエントリが含まれ、検索リクエストIDでキー付けされています |
|
metric_score はdetails セクション内で、このクエリがグローバル品質メトリックスコアに寄与することを示します |
|
unrated_docs セクションには、このクエリの検索結果内の各ドキュメントに対して_index および_id エントリが含まれ、評価値がないものが含まれます。これは、ユーザーにこれらのドキュメントの評価を提供するように求めるために使用できます |
|
hits セクションは、提供された評価とともに検索結果のグループ化を示します |
|
metric_details は、計算された品質メトリックに関する追加情報を提供します(例:取得されたドキュメントのうち、どれだけが関連していたか)。内容はメトリックごとに異なりますが、結果の解釈を改善することができます |