クエリとフィルターのコンテキスト
関連性スコア
デフォルトでは、Elasticsearchは一致する検索結果を関連性
スコアでソートします。これは、各ドキュメントがクエリにどれだけ一致しているかを測定します。
関連性スコアは正の浮動小数点数で、search APIの_score
メタデータフィールドに返されます。_score
が高いほど、ドキュメントはより関連性があります。各クエリタイプは異なる方法で関連性スコアを計算できますが、スコアの計算はクエリ句がクエリまたはフィルターコンテキストで実行されるかどうかにも依存します。
クエリコンテキスト
クエリコンテキストでは、クエリ句は「このドキュメントはこのクエリ句にどれだけ一致していますか?」という質問に答えます。ドキュメントが一致するかどうかを決定するだけでなく、クエリ句は_score
メタデータフィールドに関連性スコアも計算します。
クエリコンテキストは、クエリ句がsearch APIのquery
パラメータに渡されるときに有効になります。
フィルターコンテキスト
フィルターコンテキストでは、クエリ句は「このドキュメントはこのクエリ句に一致しますか?」という質問に答えます。答えは単純な「はい」または「いいえ」であり、スコアは計算されません。フィルターコンテキストは主に構造化データのフィルタリングに使用されます。例えば、
- この
timestamp
は2015年から2016年の範囲に入りますか? status
フィールドは"published"
に設定されていますか?
よく使用されるフィルターは、Elasticsearchによって自動的にキャッシュされ、パフォーマンスを向上させます。
フィルターコンテキストは、クエリ句がbool
クエリのfilter
パラメータ、constant_score
クエリのfilter
パラメータ、またはfilter
集約のfilter
またはmust_not
パラメータに渡されるときに有効になります。
クエリとフィルターコンテキストの例
以下は、search
APIでクエリとフィルターコンテキストで使用されるクエリ句の例です。このクエリは、次のすべての条件が満たされるドキュメントに一致します:
title
フィールドにsearch
という単語が含まれています。content
フィールドにelasticsearch
という単語が含まれています。status
フィールドにpublished
という正確な単語が含まれています。publish_date
フィールドに2015年1月1日以降の日付が含まれています。
Php
$params = [
'body' => [
'query' => [
'bool' => [
'must' => [
[
'match' => [
'title' => 'Search',
],
],
[
'match' => [
'content' => 'Elasticsearch',
],
],
],
'filter' => [
[
'term' => [
'status' => 'published',
],
],
[
'range' => [
'publish_date' => [
'gte' => '2015-01-01',
],
],
],
],
],
],
],
];
$response = $client->search($params);
Python
resp = client.search(
query={
"bool": {
"must": [
{
"match": {
"title": "Search"
}
},
{
"match": {
"content": "Elasticsearch"
}
}
],
"filter": [
{
"term": {
"status": "published"
}
},
{
"range": {
"publish_date": {
"gte": "2015-01-01"
}
}
}
]
}
},
)
print(resp)
Ruby
response = client.search(
body: {
query: {
bool: {
must: [
{
match: {
title: 'Search'
}
},
{
match: {
content: 'Elasticsearch'
}
}
],
filter: [
{
term: {
status: 'published'
}
},
{
range: {
publish_date: {
gte: '2015-01-01'
}
}
}
]
}
}
}
)
puts response
Go
res, err := es.Search(
es.Search.WithBody(strings.NewReader(`{
"query": {
"bool": {
"must": [
{
"match": {
"title": "Search"
}
},
{
"match": {
"content": "Elasticsearch"
}
}
],
"filter": [
{
"term": {
"status": "published"
}
},
{
"range": {
"publish_date": {
"gte": "2015-01-01"
}
}
}
]
}
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
Js
const response = await client.search({
query: {
bool: {
must: [
{
match: {
title: "Search",
},
},
{
match: {
content: "Elasticsearch",
},
},
],
filter: [
{
term: {
status: "published",
},
},
{
range: {
publish_date: {
gte: "2015-01-01",
},
},
},
],
},
},
});
console.log(response);
コンソール
GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
query パラメータはクエリコンテキストを示します。 |
|
bool および2つのmatch 句はクエリコンテキストで使用され、 |
|
各ドキュメントがどれだけ一致しているかをスコアリングするために使用されます。 | |
filter パラメータはフィルターコンテキストを示します。そのterm および |
|
range 句はフィルターコンテキストで使用されます。これらは一致しないドキュメントをフィルタリングしますが、 |
|
一致するドキュメントのスコアには影響しません。 |
クエリコンテキストでのクエリに対して計算されたスコアは、単精度浮動小数点数として表されます。これは、仮数の精度に24ビットしかありません。仮数の精度を超えるスコア計算は、精度の損失を伴って浮動小数点数に変換されます。
一致するドキュメントのスコアに影響を与える条件にはクエリコンテキストでクエリ句を使用し、他のすべてのクエリ句はフィルターコンテキストで使用してください。