ブールクエリ

他のクエリのブールの組み合わせに一致するドキュメントを一致させるクエリです。boolクエリはLucene BooleanQueryにマッピングされます。これは、1つ以上のブール句を使用して構築され、各句には型付きの出現があります。出現タイプは次のとおりです:

出現 説明
must 句(クエリ)は一致するドキュメントに必ず出現し、スコアに貢献します。
filter 句(クエリ)は一致するドキュメントに必ず出現しなければなりません。ただし、mustとは異なり、クエリのスコアは無視されます。フィルター句はフィルターコンテキストで実行されるため、スコアリングは無視され、句はキャッシュの対象とされます。
should 句(クエリ)は一致するドキュメントに出現する必要があります。
must_not 句(クエリ)は一致するドキュメントに出現してはなりません。句はフィルターコンテキストで実行されるため、スコアリングは無視され、句はキャッシュの対象とされます。スコアリングが無視されるため、すべてのドキュメントに0のスコアが返されます。
  1. #### Python
  2. ``````python
  3. resp = client.search(
  4. query={
  5. "bool": {
  6. "must": {
  7. "term": {
  8. "user.id": "kimchy"
  9. }
  10. },
  11. "filter": {
  12. "term": {
  13. "tags": "production"
  14. }
  15. },
  16. "must_not": {
  17. "range": {
  18. "age": {
  19. "gte": 10,
  20. "lte": 20
  21. }
  22. }
  23. },
  24. "should": [
  25. {
  26. "term": {
  27. "tags": "env1"
  28. }
  29. },
  30. {
  31. "term": {
  32. "tags": "deployed"
  33. }
  34. }
  35. ],
  36. "minimum_should_match": 1,
  37. "boost": 1
  38. }
  39. },
  40. )
  41. print(resp)
  42. `

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. bool: {
  5. must: {
  6. term: {
  7. 'user.id' => 'kimchy'
  8. }
  9. },
  10. filter: {
  11. term: {
  12. tags: 'production'
  13. }
  14. },
  15. must_not: {
  16. range: {
  17. age: {
  18. gte: 10,
  19. lte: 20
  20. }
  21. }
  22. },
  23. should: [
  24. {
  25. term: {
  26. tags: 'env1'
  27. }
  28. },
  29. {
  30. term: {
  31. tags: 'deployed'
  32. }
  33. }
  34. ],
  35. minimum_should_match: 1,
  36. boost: 1
  37. }
  38. }
  39. }
  40. )
  41. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. bool: {
  4. must: {
  5. term: {
  6. "user.id": "kimchy",
  7. },
  8. },
  9. filter: {
  10. term: {
  11. tags: "production",
  12. },
  13. },
  14. must_not: {
  15. range: {
  16. age: {
  17. gte: 10,
  18. lte: 20,
  19. },
  20. },
  21. },
  22. should: [
  23. {
  24. term: {
  25. tags: "env1",
  26. },
  27. },
  28. {
  29. term: {
  30. tags: "deployed",
  31. },
  32. },
  33. ],
  34. minimum_should_match: 1,
  35. boost: 1,
  36. },
  37. },
  38. });
  39. console.log(response);

Console

  1. POST _search
  2. {
  3. "query": {
  4. "bool" : {
  5. "must" : {
  6. "term" : { "user.id" : "kimchy" }
  7. },
  8. "filter": {
  9. "term" : { "tags" : "production" }
  10. },
  11. "must_not" : {
  12. "range" : {
  13. "age" : { "gte" : 10, "lte" : 20 }
  14. }
  15. },
  16. "should" : [
  17. { "term" : { "tags" : "env1" } },
  18. { "term" : { "tags" : "deployed" } }
  19. ],
  20. "minimum_should_match" : 1,
  21. "boost" : 1.0
  22. }
  23. }
  24. }

minimum_should_matchの使用

  1. `````bool`````クエリに少なくとも1つの`````should`````句が含まれ、`````must`````または`````filter`````句が含まれていない場合、デフォルト値は`````1`````です。それ以外の場合、デフォルト値は`````0`````です。
  2. 他の有効な値については、[`````minimum_should_match`````パラメータ](/read/elasticsearch-8-15/a80bb044b9570e8b.md)を参照してください。
  3. ## bool.filterによるスコアリング
  4. `````filter`````要素の下で指定されたクエリはスコアリングに影響を与えません—スコアは`````0`````として返されます。スコアは指定されたクエリによってのみ影響を受けます。たとえば、次の3つのクエリはすべて、`````status`````フィールドに`````active`````という用語が含まれるすべてのドキュメントを返します。
  5. この最初のクエリは、スコアリングクエリが指定されていないため、すべてのドキュメントに`````0`````のスコアを割り当てます:
  6. #### Php
  7. ``````php
  8. $params = [
  9. 'body' => [
  10. 'query' => [
  11. 'bool' => [
  12. 'filter' => [
  13. 'term' => [
  14. 'status' => 'active',
  15. ],
  16. ],
  17. ],
  18. ],
  19. ],
  20. ];
  21. $response = $client->search($params);
  22. `

Python

  1. resp = client.search(
  2. query={
  3. "bool": {
  4. "filter": {
  5. "term": {
  6. "status": "active"
  7. }
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. bool: {
  5. filter: {
  6. term: {
  7. status: 'active'
  8. }
  9. }
  10. }
  11. }
  12. }
  13. )
  14. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "bool": {
  5. "filter": {
  6. "term": {
  7. "status": "active"
  8. }
  9. }
  10. }
  11. }
  12. }`)),
  13. es.Search.WithPretty(),
  14. )
  15. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. bool: {
  4. filter: {
  5. term: {
  6. status: "active",
  7. },
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

Console

  1. GET _search
  2. {
  3. "query": {
  4. "bool": {
  5. "filter": {
  6. "term": {
  7. "status": "active"
  8. }
  9. }
  10. }
  11. }
  12. }

このboolクエリにはmatch_allクエリがあり、すべてのドキュメントに1.0のスコアを割り当てます。

Php

  1. $params = [
  2. 'body' => [
  3. 'query' => [
  4. 'bool' => [
  5. 'must' => [
  6. 'match_all' => [
  7. ],
  8. ],
  9. 'filter' => [
  10. 'term' => [
  11. 'status' => 'active',
  12. ],
  13. ],
  14. ],
  15. ],
  16. ],
  17. ];
  18. $response = $client->search($params);

Python

  1. resp = client.search(
  2. query={
  3. "bool": {
  4. "must": {
  5. "match_all": {}
  6. },
  7. "filter": {
  8. "term": {
  9. "status": "active"
  10. }
  11. }
  12. }
  13. },
  14. )
  15. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. bool: {
  5. must: {
  6. match_all: {}
  7. },
  8. filter: {
  9. term: {
  10. status: 'active'
  11. }
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "term": {
  10. "status": "active"
  11. }
  12. }
  13. }
  14. }
  15. }`)),
  16. es.Search.WithPretty(),
  17. )
  18. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. bool: {
  4. must: {
  5. match_all: {},
  6. },
  7. filter: {
  8. term: {
  9. status: "active",
  10. },
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);

Console

  1. GET _search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "term": {
  10. "status": "active"
  11. }
  12. }
  13. }
  14. }
  15. }

このconstant_scoreクエリは、上記の2番目の例とまったく同じように動作します。constant_scoreクエリは、フィルターによって一致したすべてのドキュメントに1.0のスコアを割り当てます。

Php

  1. $params = [
  2. 'body' => [
  3. 'query' => [
  4. 'constant_score' => [
  5. 'filter' => [
  6. 'term' => [
  7. 'status' => 'active',
  8. ],
  9. ],
  10. ],
  11. ],
  12. ],
  13. ];
  14. $response = $client->search($params);

Python

  1. resp = client.search(
  2. query={
  3. "constant_score": {
  4. "filter": {
  5. "term": {
  6. "status": "active"
  7. }
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. constant_score: {
  5. filter: {
  6. term: {
  7. status: 'active'
  8. }
  9. }
  10. }
  11. }
  12. }
  13. )
  14. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "constant_score": {
  5. "filter": {
  6. "term": {
  7. "status": "active"
  8. }
  9. }
  10. }
  11. }
  12. }`)),
  13. es.Search.WithPretty(),
  14. )
  15. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. constant_score: {
  4. filter: {
  5. term: {
  6. status: "active",
  7. },
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

Console

  1. GET _search
  2. {
  3. "query": {
  4. "constant_score": {
  5. "filter": {
  6. "term": {
  7. "status": "active"
  8. }
  9. }
  10. }
  11. }
  12. }

名前付きクエリ

各クエリは、そのトップレベルの定義に_nameを受け入れます。名前付きクエリを使用して、どのクエリが返されたドキュメントに一致したかを追跡できます。名前付きクエリが使用される場合、レスポンスには各ヒットのmatched_queriesプロパティが含まれます。

同じリクエスト内で重複する_name値を提供すると、未定義の動作が発生します。重複する名前のクエリは互いに上書きされる可能性があります。クエリ名は、単一のリクエスト内で一意であると見なされます。

Python

  1. resp = client.search(
  2. query={
  3. "bool": {
  4. "should": [
  5. {
  6. "match": {
  7. "name.first": {
  8. "query": "shay",
  9. "_name": "first"
  10. }
  11. }
  12. },
  13. {
  14. "match": {
  15. "name.last": {
  16. "query": "banon",
  17. "_name": "last"
  18. }
  19. }
  20. }
  21. ],
  22. "filter": {
  23. "terms": {
  24. "name.last": [
  25. "banon",
  26. "kimchy"
  27. ],
  28. "_name": "test"
  29. }
  30. }
  31. }
  32. },
  33. )
  34. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. bool: {
  5. should: [
  6. {
  7. match: {
  8. 'name.first' => {
  9. query: 'shay',
  10. _name: 'first'
  11. }
  12. }
  13. },
  14. {
  15. match: {
  16. 'name.last' => {
  17. query: 'banon',
  18. _name: 'last'
  19. }
  20. }
  21. }
  22. ],
  23. filter: {
  24. terms: {
  25. 'name.last' => [
  26. 'banon',
  27. 'kimchy'
  28. ],
  29. _name: 'test'
  30. }
  31. }
  32. }
  33. }
  34. }
  35. )
  36. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. bool: {
  4. should: [
  5. {
  6. match: {
  7. "name.first": {
  8. query: "shay",
  9. _name: "first",
  10. },
  11. },
  12. },
  13. {
  14. match: {
  15. "name.last": {
  16. query: "banon",
  17. _name: "last",
  18. },
  19. },
  20. },
  21. ],
  22. filter: {
  23. terms: {
  24. "name.last": ["banon", "kimchy"],
  25. _name: "test",
  26. },
  27. },
  28. },
  29. },
  30. });
  31. console.log(response);

Console

  1. GET /_search
  2. {
  3. "query": {
  4. "bool": {
  5. "should": [
  6. { "match": { "name.first": { "query": "shay", "_name": "first" } } },
  7. { "match": { "name.last": { "query": "banon", "_name": "last" } } }
  8. ],
  9. "filter": {
  10. "terms": {
  11. "name.last": [ "banon", "kimchy" ],
  12. "_name": "test"
  13. }
  14. }
  15. }
  16. }
  17. }
  1. スコアは、たとえばフィルターやmust_notコンテキストに出現する名前付きクエリ、または`````constant_score``````````function_score_query`````のようにスコアを無視または変更する句の内部にある場合、ドキュメントの最終スコアに寄与しない可能性があることに注意してください。
  2. #### Python
  3. ``````python
  4. resp = client.search(
  5. include_named_queries_score=True,
  6. query={
  7. "bool": {
  8. "should": [
  9. {
  10. "match": {
  11. "name.first": {
  12. "query": "shay",
  13. "_name": "first"
  14. }
  15. }
  16. },
  17. {
  18. "match": {
  19. "name.last": {
  20. "query": "banon",
  21. "_name": "last"
  22. }
  23. }
  24. }
  25. ],
  26. "filter": {
  27. "terms": {
  28. "name.last": [
  29. "banon",
  30. "kimchy"
  31. ],
  32. "_name": "test"
  33. }
  34. }
  35. }
  36. },
  37. )
  38. print(resp)
  39. `

Ruby

  1. response = client.search(
  2. include_named_queries_score: true,
  3. body: {
  4. query: {
  5. bool: {
  6. should: [
  7. {
  8. match: {
  9. 'name.first' => {
  10. query: 'shay',
  11. _name: 'first'
  12. }
  13. }
  14. },
  15. {
  16. match: {
  17. 'name.last' => {
  18. query: 'banon',
  19. _name: 'last'
  20. }
  21. }
  22. }
  23. ],
  24. filter: {
  25. terms: {
  26. 'name.last' => [
  27. 'banon',
  28. 'kimchy'
  29. ],
  30. _name: 'test'
  31. }
  32. }
  33. }
  34. }
  35. }
  36. )
  37. puts response

Js

  1. const response = await client.search({
  2. include_named_queries_score: "true",
  3. query: {
  4. bool: {
  5. should: [
  6. {
  7. match: {
  8. "name.first": {
  9. query: "shay",
  10. _name: "first",
  11. },
  12. },
  13. },
  14. {
  15. match: {
  16. "name.last": {
  17. query: "banon",
  18. _name: "last",
  19. },
  20. },
  21. },
  22. ],
  23. filter: {
  24. terms: {
  25. "name.last": ["banon", "kimchy"],
  26. _name: "test",
  27. },
  28. },
  29. },
  30. },
  31. });
  32. console.log(response);

Console

  1. GET /_search?include_named_queries_score
  2. {
  3. "query": {
  4. "bool": {
  5. "should": [
  6. { "match": { "name.first": { "query": "shay", "_name": "first" } } },
  7. { "match": { "name.last": { "query": "banon", "_name": "last" } } }
  8. ],
  9. "filter": {
  10. "terms": {
  11. "name.last": [ "banon", "kimchy" ],
  12. "_name": "test"
  13. }
  14. }
  15. }
  16. }
  17. }

この機能は、検索レスポンスの各ヒットで各名前付きクエリを再実行します。通常、これによりリクエストにわずかなオーバーヘッドが追加されます。ただし、大量のヒットに対して計算コストの高い名前付きクエリを使用すると、かなりのオーバーヘッドが追加される可能性があります。たとえば、多くのバケットに対するtop_hits集約と組み合わせた名前付きクエリは、応答時間を長くする可能性があります。