クエリとフィルターのコンテキスト

関連性スコア

デフォルトでは、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

  1. $params = [
  2. 'body' => [
  3. 'query' => [
  4. 'bool' => [
  5. 'must' => [
  6. [
  7. 'match' => [
  8. 'title' => 'Search',
  9. ],
  10. ],
  11. [
  12. 'match' => [
  13. 'content' => 'Elasticsearch',
  14. ],
  15. ],
  16. ],
  17. 'filter' => [
  18. [
  19. 'term' => [
  20. 'status' => 'published',
  21. ],
  22. ],
  23. [
  24. 'range' => [
  25. 'publish_date' => [
  26. 'gte' => '2015-01-01',
  27. ],
  28. ],
  29. ],
  30. ],
  31. ],
  32. ],
  33. ],
  34. ];
  35. $response = $client->search($params);

Python

  1. resp = client.search(
  2. query={
  3. "bool": {
  4. "must": [
  5. {
  6. "match": {
  7. "title": "Search"
  8. }
  9. },
  10. {
  11. "match": {
  12. "content": "Elasticsearch"
  13. }
  14. }
  15. ],
  16. "filter": [
  17. {
  18. "term": {
  19. "status": "published"
  20. }
  21. },
  22. {
  23. "range": {
  24. "publish_date": {
  25. "gte": "2015-01-01"
  26. }
  27. }
  28. }
  29. ]
  30. }
  31. },
  32. )
  33. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. bool: {
  5. must: [
  6. {
  7. match: {
  8. title: 'Search'
  9. }
  10. },
  11. {
  12. match: {
  13. content: 'Elasticsearch'
  14. }
  15. }
  16. ],
  17. filter: [
  18. {
  19. term: {
  20. status: 'published'
  21. }
  22. },
  23. {
  24. range: {
  25. publish_date: {
  26. gte: '2015-01-01'
  27. }
  28. }
  29. }
  30. ]
  31. }
  32. }
  33. }
  34. )
  35. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {
  7. "match": {
  8. "title": "Search"
  9. }
  10. },
  11. {
  12. "match": {
  13. "content": "Elasticsearch"
  14. }
  15. }
  16. ],
  17. "filter": [
  18. {
  19. "term": {
  20. "status": "published"
  21. }
  22. },
  23. {
  24. "range": {
  25. "publish_date": {
  26. "gte": "2015-01-01"
  27. }
  28. }
  29. }
  30. ]
  31. }
  32. }
  33. }`)),
  34. es.Search.WithPretty(),
  35. )
  36. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. bool: {
  4. must: [
  5. {
  6. match: {
  7. title: "Search",
  8. },
  9. },
  10. {
  11. match: {
  12. content: "Elasticsearch",
  13. },
  14. },
  15. ],
  16. filter: [
  17. {
  18. term: {
  19. status: "published",
  20. },
  21. },
  22. {
  23. range: {
  24. publish_date: {
  25. gte: "2015-01-01",
  26. },
  27. },
  28. },
  29. ],
  30. },
  31. },
  32. });
  33. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. { "match": { "title": "Search" }},
  7. { "match": { "content": "Elasticsearch" }}
  8. ],
  9. "filter": [
  10. { "term": { "status": "published" }},
  11. { "range": { "publish_date": { "gte": "2015-01-01" }}}
  12. ]
  13. }
  14. }
  15. }
queryパラメータはクエリコンテキストを示します。
boolおよび2つのmatch句はクエリコンテキストで使用され、
各ドキュメントがどれだけ一致しているかをスコアリングするために使用されます。
filterパラメータはフィルターコンテキストを示します。そのtermおよび
range句はフィルターコンテキストで使用されます。これらは一致しないドキュメントをフィルタリングしますが、
一致するドキュメントのスコアには影響しません。

クエリコンテキストでのクエリに対して計算されたスコアは、単精度浮動小数点数として表されます。これは、仮数の精度に24ビットしかありません。仮数の精度を超えるスコア計算は、精度の損失を伴って浮動小数点数に変換されます。

一致するドキュメントのスコアに影響を与える条件にはクエリコンテキストでクエリ句を使用し、他のすべてのクエリ句はフィルターコンテキストで使用してください。