ネストされたクエリ

別のクエリをラップしてnestedフィールドを検索します。

  1. ## 例のリクエスト
  2. ### インデックス設定
  3. `````nested`````クエリを使用するには、インデックスに[nested](/read/elasticsearch-8-15/5ccf197014f16687.md)フィールドマッピングが含まれている必要があります。例えば:
  4. #### Python
  5. ``````python
  6. resp = client.indices.create(
  7. index="my-index-000001",
  8. mappings={
  9. "properties": {
  10. "obj1": {
  11. "type": "nested"
  12. }
  13. }
  14. },
  15. )
  16. print(resp)
  17. `

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. "obj1": {
  7. type: 'nested'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response

Go

  1. res, err := es.Indices.Create(
  2. "my-index-000001",
  3. es.Indices.Create.WithBody(strings.NewReader(`{
  4. "mappings": {
  5. "properties": {
  6. "obj1": {
  7. "type": "nested"
  8. }
  9. }
  10. }
  11. }`)),
  12. )
  13. fmt.Println(res, err)

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. obj1: {
  6. type: "nested",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);

コンソール

  1. PUT /my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "obj1": {
  6. "type": "nested"
  7. }
  8. }
  9. }
  10. }

例のクエリ

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. query={
  4. "nested": {
  5. "path": "obj1",
  6. "query": {
  7. "bool": {
  8. "must": [
  9. {
  10. "match": {
  11. "obj1.name": "blue"
  12. }
  13. },
  14. {
  15. "range": {
  16. "obj1.count": {
  17. "gt": 5
  18. }
  19. }
  20. }
  21. ]
  22. }
  23. },
  24. "score_mode": "avg"
  25. }
  26. },
  27. )
  28. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. body: {
  4. query: {
  5. nested: {
  6. path: 'obj1',
  7. query: {
  8. bool: {
  9. must: [
  10. {
  11. match: {
  12. "obj1.name": 'blue'
  13. }
  14. },
  15. {
  16. range: {
  17. "obj1.count": {
  18. gt: 5
  19. }
  20. }
  21. }
  22. ]
  23. }
  24. },
  25. score_mode: 'avg'
  26. }
  27. }
  28. }
  29. )
  30. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithIndex("my-index-000001"),
  3. es.Search.WithBody(strings.NewReader(`{
  4. "query": {
  5. "nested": {
  6. "path": "obj1",
  7. "query": {
  8. "bool": {
  9. "must": [
  10. {
  11. "match": {
  12. "obj1.name": "blue"
  13. }
  14. },
  15. {
  16. "range": {
  17. "obj1.count": {
  18. "gt": 5
  19. }
  20. }
  21. }
  22. ]
  23. }
  24. },
  25. "score_mode": "avg"
  26. }
  27. }
  28. }`)),
  29. es.Search.WithPretty(),
  30. )
  31. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. query: {
  4. nested: {
  5. path: "obj1",
  6. query: {
  7. bool: {
  8. must: [
  9. {
  10. match: {
  11. "obj1.name": "blue",
  12. },
  13. },
  14. {
  15. range: {
  16. "obj1.count": {
  17. gt: 5,
  18. },
  19. },
  20. },
  21. ],
  22. },
  23. },
  24. score_mode: "avg",
  25. },
  26. },
  27. });
  28. console.log(response);

コンソール

  1. GET /my-index-000001/_search
  2. {
  3. "query": {
  4. "nested": {
  5. "path": "obj1",
  6. "query": {
  7. "bool": {
  8. "must": [
  9. { "match": { "obj1.name": "blue" } },
  10. { "range": { "obj1.count": { "gt": 5 } } }
  11. ]
  12. }
  13. },
  14. "score_mode": "avg"
  15. }
  16. }
  17. }

ネストされたためのトップレベルパラメータ

  • path
  • (必須、文字列) 検索したいネストされたオブジェクトへのパス。
  • query
  • (必須、クエリオブジェクト) path内のネストされたオブジェクトに対して実行したいクエリ。オブジェクトが検索に一致する場合、nestedクエリはルート親ドキュメントを返します。
    完全なパスを含むドット表記を使用してネストされたフィールドを検索できます。例えばobj1.name
    マルチレベルのネストは自動的にサポートされ、検出され、関連するネストレベルに自動的に一致する内部ネストクエリが生成されます。別のネストされたクエリ内に存在する場合は、ルートではなく、ネストされたレベルに一致します。
    例についてはマルチレベルネストクエリを参照してください。
  • score_mode
  • (オプション、文字列) 一致する子オブジェクトのスコアがルート親ドキュメントの関連スコアにどのように影響するかを示します。有効な値は次のとおりです:
    • avg (デフォルト)
    • 一致するすべての子オブジェクトの平均関連スコアを使用します。
    • max
    • 一致するすべての子オブジェクトの最高関連スコアを使用します。
    • min
    • 一致するすべての子オブジェクトの最低関連スコアを使用します。
    • none
    • 一致する子オブジェクトの関連スコアを使用しません。クエリは親ドキュメントに0のスコアを割り当てます。
    • sum
    • 一致するすべての子オブジェクトの関連スコアを合計します。
  • ignore_unmapped
  • (オプション、ブール値) マッピングされていないpathを無視し、エラーの代わりにドキュメントを返さないかどうかを示します。デフォルトはfalseです。
    falseの場合、Elasticsearchはpathがマッピングされていないフィールドである場合にエラーを返します。
    このパラメータを使用して、pathフィールドを含まない可能性のある複数のインデックスをクエリできます。

ノート

スクリプトクエリのコンテキスト

ネストされたクエリ内でscriptクエリを実行すると、親またはルートドキュメントではなく、ネストされたドキュメントからのdoc値にのみアクセスできます。

マルチレベルネストクエリ

マルチレベルネストクエリがどのように機能するかを確認するには、まずネストされたフィールドを持つインデックスが必要です。次のリクエストは、ネストされたmakeおよびmodelフィールドを持つdriversインデックスのマッピングを定義します。

Python

  1. resp = client.indices.create(
  2. index="drivers",
  3. mappings={
  4. "properties": {
  5. "driver": {
  6. "type": "nested",
  7. "properties": {
  8. "last_name": {
  9. "type": "text"
  10. },
  11. "vehicle": {
  12. "type": "nested",
  13. "properties": {
  14. "make": {
  15. "type": "text"
  16. },
  17. "model": {
  18. "type": "text"
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }
  25. },
  26. )
  27. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'drivers',
  3. body: {
  4. mappings: {
  5. properties: {
  6. driver: {
  7. type: 'nested',
  8. properties: {
  9. last_name: {
  10. type: 'text'
  11. },
  12. vehicle: {
  13. type: 'nested',
  14. properties: {
  15. make: {
  16. type: 'text'
  17. },
  18. model: {
  19. type: 'text'
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }
  26. }
  27. }
  28. )
  29. puts response

Go

  1. res, err := es.Indices.Create(
  2. "drivers",
  3. es.Indices.Create.WithBody(strings.NewReader(`{
  4. "mappings": {
  5. "properties": {
  6. "driver": {
  7. "type": "nested",
  8. "properties": {
  9. "last_name": {
  10. "type": "text"
  11. },
  12. "vehicle": {
  13. "type": "nested",
  14. "properties": {
  15. "make": {
  16. "type": "text"
  17. },
  18. "model": {
  19. "type": "text"
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }
  26. }
  27. }`)),
  28. )
  29. fmt.Println(res, err)

Js

  1. const response = await client.indices.create({
  2. index: "drivers",
  3. mappings: {
  4. properties: {
  5. driver: {
  6. type: "nested",
  7. properties: {
  8. last_name: {
  9. type: "text",
  10. },
  11. vehicle: {
  12. type: "nested",
  13. properties: {
  14. make: {
  15. type: "text",
  16. },
  17. model: {
  18. type: "text",
  19. },
  20. },
  21. },
  22. },
  23. },
  24. },
  25. },
  26. });
  27. console.log(response);

コンソール

  1. PUT /drivers
  2. {
  3. "mappings": {
  4. "properties": {
  5. "driver": {
  6. "type": "nested",
  7. "properties": {
  8. "last_name": {
  9. "type": "text"
  10. },
  11. "vehicle": {
  12. "type": "nested",
  13. "properties": {
  14. "make": {
  15. "type": "text"
  16. },
  17. "model": {
  18. "type": "text"
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }
  26. }

次に、driversインデックスにいくつかのドキュメントをインデックスします。

Php

  1. $params = [
  2. 'index' => 'drivers',
  3. 'id' => '1',
  4. 'body' => [
  5. 'driver' => [
  6. 'last_name' => 'McQueen',
  7. 'vehicle' => [
  8. [
  9. 'make' => 'Powell Motors',
  10. 'model' => 'Canyonero',
  11. ],
  12. [
  13. 'make' => 'Miller-Meteor',
  14. 'model' => 'Ecto-1',
  15. ],
  16. ],
  17. ],
  18. ],
  19. ];
  20. $response = $client->index($params);
  21. $params = [
  22. 'index' => 'drivers',
  23. 'id' => '2',
  24. 'body' => [
  25. 'driver' => [
  26. 'last_name' => 'Hudson',
  27. 'vehicle' => [
  28. [
  29. 'make' => 'Mifune',
  30. 'model' => 'Mach Five',
  31. ],
  32. [
  33. 'make' => 'Miller-Meteor',
  34. 'model' => 'Ecto-1',
  35. ],
  36. ],
  37. ],
  38. ],
  39. ];
  40. $response = $client->index($params);

Python

  1. resp = client.index(
  2. index="drivers",
  3. id="1",
  4. document={
  5. "driver": {
  6. "last_name": "McQueen",
  7. "vehicle": [
  8. {
  9. "make": "Powell Motors",
  10. "model": "Canyonero"
  11. },
  12. {
  13. "make": "Miller-Meteor",
  14. "model": "Ecto-1"
  15. }
  16. ]
  17. }
  18. },
  19. )
  20. print(resp)
  21. resp1 = client.index(
  22. index="drivers",
  23. id="2",
  24. refresh=True,
  25. document={
  26. "driver": {
  27. "last_name": "Hudson",
  28. "vehicle": [
  29. {
  30. "make": "Mifune",
  31. "model": "Mach Five"
  32. },
  33. {
  34. "make": "Miller-Meteor",
  35. "model": "Ecto-1"
  36. }
  37. ]
  38. }
  39. },
  40. )
  41. print(resp1)

Ruby

  1. response = client.index(
  2. index: 'drivers',
  3. id: 1,
  4. body: {
  5. driver: {
  6. last_name: 'McQueen',
  7. vehicle: [
  8. {
  9. make: 'Powell Motors',
  10. model: 'Canyonero'
  11. },
  12. {
  13. make: 'Miller-Meteor',
  14. model: 'Ecto-1'
  15. }
  16. ]
  17. }
  18. }
  19. )
  20. puts response
  21. response = client.index(
  22. index: 'drivers',
  23. id: 2,
  24. refresh: true,
  25. body: {
  26. driver: {
  27. last_name: 'Hudson',
  28. vehicle: [
  29. {
  30. make: 'Mifune',
  31. model: 'Mach Five'
  32. },
  33. {
  34. make: 'Miller-Meteor',
  35. model: 'Ecto-1'
  36. }
  37. ]
  38. }
  39. }
  40. )
  41. puts response

Go

  1. {
  2. res, err := es.Index(
  3. "drivers",
  4. strings.NewReader(`{
  5. "driver": {
  6. "last_name": "McQueen",
  7. "vehicle": [
  8. {
  9. "make": "Powell Motors",
  10. "model": "Canyonero"
  11. },
  12. {
  13. "make": "Miller-Meteor",
  14. "model": "Ecto-1"
  15. }
  16. ]
  17. }
  18. }`),
  19. es.Index.WithDocumentID("1"),
  20. es.Index.WithPretty(),
  21. )
  22. fmt.Println(res, err)
  23. }
  24. {
  25. res, err := es.Index(
  26. "drivers",
  27. strings.NewReader(`{
  28. "driver": {
  29. "last_name": "Hudson",
  30. "vehicle": [
  31. {
  32. "make": "Mifune",
  33. "model": "Mach Five"
  34. },
  35. {
  36. "make": "Miller-Meteor",
  37. "model": "Ecto-1"
  38. }
  39. ]
  40. }
  41. }`),
  42. es.Index.WithDocumentID("2"),
  43. es.Index.WithRefresh("true"),
  44. es.Index.WithPretty(),
  45. )
  46. fmt.Println(res, err)
  47. }

Js

  1. const response = await client.index({
  2. index: "drivers",
  3. id: 1,
  4. document: {
  5. driver: {
  6. last_name: "McQueen",
  7. vehicle: [
  8. {
  9. make: "Powell Motors",
  10. model: "Canyonero",
  11. },
  12. {
  13. make: "Miller-Meteor",
  14. model: "Ecto-1",
  15. },
  16. ],
  17. },
  18. },
  19. });
  20. console.log(response);
  21. const response1 = await client.index({
  22. index: "drivers",
  23. id: 2,
  24. refresh: "true",
  25. document: {
  26. driver: {
  27. last_name: "Hudson",
  28. vehicle: [
  29. {
  30. make: "Mifune",
  31. model: "Mach Five",
  32. },
  33. {
  34. make: "Miller-Meteor",
  35. model: "Ecto-1",
  36. },
  37. ],
  38. },
  39. },
  40. });
  41. console.log(response1);

コンソール

  1. PUT /drivers/_doc/1
  2. {
  3. "driver" : {
  4. "last_name" : "McQueen",
  5. "vehicle" : [
  6. {
  7. "make" : "Powell Motors",
  8. "model" : "Canyonero"
  9. },
  10. {
  11. "make" : "Miller-Meteor",
  12. "model" : "Ecto-1"
  13. }
  14. ]
  15. }
  16. }
  17. PUT /drivers/_doc/2?refresh
  18. {
  19. "driver" : {
  20. "last_name" : "Hudson",
  21. "vehicle" : [
  22. {
  23. "make" : "Mifune",
  24. "model" : "Mach Five"
  25. },
  26. {
  27. "make" : "Miller-Meteor",
  28. "model" : "Ecto-1"
  29. }
  30. ]
  31. }
  32. }

これで、makeおよびmodelフィールドに基づいてドキュメントを一致させるためにマルチレベルネストクエリを使用できます。

Python

  1. resp = client.search(
  2. index="drivers",
  3. query={
  4. "nested": {
  5. "path": "driver",
  6. "query": {
  7. "nested": {
  8. "path": "driver.vehicle",
  9. "query": {
  10. "bool": {
  11. "must": [
  12. {
  13. "match": {
  14. "driver.vehicle.make": "Powell Motors"
  15. }
  16. },
  17. {
  18. "match": {
  19. "driver.vehicle.model": "Canyonero"
  20. }
  21. }
  22. ]
  23. }
  24. }
  25. }
  26. }
  27. }
  28. },
  29. )
  30. print(resp)

Ruby

  1. response = client.search(
  2. index: 'drivers',
  3. body: {
  4. query: {
  5. nested: {
  6. path: 'driver',
  7. query: {
  8. nested: {
  9. path: 'driver.vehicle',
  10. query: {
  11. bool: {
  12. must: [
  13. {
  14. match: {
  15. 'driver.vehicle.make' => 'Powell Motors'
  16. }
  17. },
  18. {
  19. match: {
  20. 'driver.vehicle.model' => 'Canyonero'
  21. }
  22. }
  23. ]
  24. }
  25. }
  26. }
  27. }
  28. }
  29. }
  30. }
  31. )
  32. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithIndex("drivers"),
  3. es.Search.WithBody(strings.NewReader(`{
  4. "query": {
  5. "nested": {
  6. "path": "driver",
  7. "query": {
  8. "nested": {
  9. "path": "driver.vehicle",
  10. "query": {
  11. "bool": {
  12. "must": [
  13. {
  14. "match": {
  15. "driver.vehicle.make": "Powell Motors"
  16. }
  17. },
  18. {
  19. "match": {
  20. "driver.vehicle.model": "Canyonero"
  21. }
  22. }
  23. ]
  24. }
  25. }
  26. }
  27. }
  28. }
  29. }
  30. }`)),
  31. es.Search.WithPretty(),
  32. )
  33. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. index: "drivers",
  3. query: {
  4. nested: {
  5. path: "driver",
  6. query: {
  7. nested: {
  8. path: "driver.vehicle",
  9. query: {
  10. bool: {
  11. must: [
  12. {
  13. match: {
  14. "driver.vehicle.make": "Powell Motors",
  15. },
  16. },
  17. {
  18. match: {
  19. "driver.vehicle.model": "Canyonero",
  20. },
  21. },
  22. ],
  23. },
  24. },
  25. },
  26. },
  27. },
  28. },
  29. });
  30. console.log(response);

コンソール

  1. GET /drivers/_search
  2. {
  3. "query": {
  4. "nested": {
  5. "path": "driver",
  6. "query": {
  7. "nested": {
  8. "path": "driver.vehicle",
  9. "query": {
  10. "bool": {
  11. "must": [
  12. { "match": { "driver.vehicle.make": "Powell Motors" } },
  13. { "match": { "driver.vehicle.model": "Canyonero" } }
  14. ]
  15. }
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }

検索リクエストは次の応答を返します:

コンソール-結果

  1. {
  2. "took" : 5,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 1,
  13. "relation" : "eq"
  14. },
  15. "max_score" : 3.7349272,
  16. "hits" : [
  17. {
  18. "_index" : "drivers",
  19. "_id" : "1",
  20. "_score" : 3.7349272,
  21. "_source" : {
  22. "driver" : {
  23. "last_name" : "McQueen",
  24. "vehicle" : [
  25. {
  26. "make" : "Powell Motors",
  27. "model" : "Canyonero"
  28. },
  29. {
  30. "make" : "Miller-Meteor",
  31. "model" : "Ecto-1"
  32. }
  33. ]
  34. }
  35. }
  36. }
  37. ]
  38. }
  39. }

must_not句とネストクエリ

  1. [`````inner_hits`````](/read/elasticsearch-8-15/4bfa3660dc6a8b2b.md)パラメータを使用して、`````nested`````クエリに一致したネストされたオブジェクトを確認できます。
  2. 例えば、次の検索は、外部`````nested`````クエリと内部`````must_not`````句を使用します。
  3. #### Python
  4. ``````python
  5. resp = client.indices.create(
  6. index="my-index",
  7. mappings={
  8. "properties": {
  9. "comments": {
  10. "type": "nested"
  11. }
  12. }
  13. },
  14. )
  15. print(resp)
  16. resp1 = client.index(
  17. index="my-index",
  18. id="1",
  19. refresh=True,
  20. document={
  21. "comments": [
  22. {
  23. "author": "kimchy"
  24. }
  25. ]
  26. },
  27. )
  28. print(resp1)
  29. resp2 = client.index(
  30. index="my-index",
  31. id="2",
  32. refresh=True,
  33. document={
  34. "comments": [
  35. {
  36. "author": "kimchy"
  37. },
  38. {
  39. "author": "nik9000"
  40. }
  41. ]
  42. },
  43. )
  44. print(resp2)
  45. resp3 = client.index(
  46. index="my-index",
  47. id="3",
  48. refresh=True,
  49. document={
  50. "comments": [
  51. {
  52. "author": "nik9000"
  53. }
  54. ]
  55. },
  56. )
  57. print(resp3)
  58. resp4 = client.search(
  59. index="my-index",
  60. query={
  61. "nested": {
  62. "path": "comments",
  63. "query": {
  64. "bool": {
  65. "must_not": [
  66. {
  67. "term": {
  68. "comments.author": "nik9000"
  69. }
  70. }
  71. ]
  72. }
  73. }
  74. }
  75. },
  76. )
  77. print(resp4)
  78. `

Ruby

  1. response = client.indices.create(
  2. index: 'my-index',
  3. body: {
  4. mappings: {
  5. properties: {
  6. comments: {
  7. type: 'nested'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response
  14. response = client.index(
  15. index: 'my-index',
  16. id: 1,
  17. refresh: true,
  18. body: {
  19. comments: [
  20. {
  21. author: 'kimchy'
  22. }
  23. ]
  24. }
  25. )
  26. puts response
  27. response = client.index(
  28. index: 'my-index',
  29. id: 2,
  30. refresh: true,
  31. body: {
  32. comments: [
  33. {
  34. author: 'kimchy'
  35. },
  36. {
  37. author: 'nik9000'
  38. }
  39. ]
  40. }
  41. )
  42. puts response
  43. response = client.index(
  44. index: 'my-index',
  45. id: 3,
  46. refresh: true,
  47. body: {
  48. comments: [
  49. {
  50. author: 'nik9000'
  51. }
  52. ]
  53. }
  54. )
  55. puts response
  56. response = client.search(
  57. index: 'my-index',
  58. body: {
  59. query: {
  60. nested: {
  61. path: 'comments',
  62. query: {
  63. bool: {
  64. must_not: [
  65. {
  66. term: {
  67. 'comments.author' => 'nik9000'
  68. }
  69. }
  70. ]
  71. }
  72. }
  73. }
  74. }
  75. }
  76. )
  77. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index",
  3. mappings: {
  4. properties: {
  5. comments: {
  6. type: "nested",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);
  12. const response1 = await client.index({
  13. index: "my-index",
  14. id: 1,
  15. refresh: "true",
  16. document: {
  17. comments: [
  18. {
  19. author: "kimchy",
  20. },
  21. ],
  22. },
  23. });
  24. console.log(response1);
  25. const response2 = await client.index({
  26. index: "my-index",
  27. id: 2,
  28. refresh: "true",
  29. document: {
  30. comments: [
  31. {
  32. author: "kimchy",
  33. },
  34. {
  35. author: "nik9000",
  36. },
  37. ],
  38. },
  39. });
  40. console.log(response2);
  41. const response3 = await client.index({
  42. index: "my-index",
  43. id: 3,
  44. refresh: "true",
  45. document: {
  46. comments: [
  47. {
  48. author: "nik9000",
  49. },
  50. ],
  51. },
  52. });
  53. console.log(response3);
  54. const response4 = await client.search({
  55. index: "my-index",
  56. query: {
  57. nested: {
  58. path: "comments",
  59. query: {
  60. bool: {
  61. must_not: [
  62. {
  63. term: {
  64. "comments.author": "nik9000",
  65. },
  66. },
  67. ],
  68. },
  69. },
  70. },
  71. },
  72. });
  73. console.log(response4);

コンソール

  1. PUT my-index
  2. {
  3. "mappings": {
  4. "properties": {
  5. "comments": {
  6. "type": "nested"
  7. }
  8. }
  9. }
  10. }
  11. PUT my-index/_doc/1?refresh
  12. {
  13. "comments": [
  14. {
  15. "author": "kimchy"
  16. }
  17. ]
  18. }
  19. PUT my-index/_doc/2?refresh
  20. {
  21. "comments": [
  22. {
  23. "author": "kimchy"
  24. },
  25. {
  26. "author": "nik9000"
  27. }
  28. ]
  29. }
  30. PUT my-index/_doc/3?refresh
  31. {
  32. "comments": [
  33. {
  34. "author": "nik9000"
  35. }
  36. ]
  37. }
  38. POST my-index/_search
  39. {
  40. "query": {
  41. "nested": {
  42. "path": "comments",
  43. "query": {
  44. "bool": {
  45. "must_not": [
  46. {
  47. "term": {
  48. "comments.author": "nik9000"
  49. }
  50. }
  51. ]
  52. }
  53. }
  54. }
  55. }
  56. }

検索結果:

コンソール

  1. {
  2. ...
  3. "hits" : {
  4. ...
  5. "hits" : [
  6. {
  7. "_index" : "my-index",
  8. "_id" : "1",
  9. "_score" : 0.0,
  10. "_source" : {
  11. "comments" : [
  12. {
  13. "author" : "kimchy"
  14. }
  15. ]
  16. }
  17. },
  18. {
  19. "_index" : "my-index",
  20. "_id" : "2",
  21. "_score" : 0.0,
  22. "_source" : {
  23. "comments" : [
  24. {
  25. "author" : "kimchy"
  26. },
  27. {
  28. "author" : "nik9000"
  29. }
  30. ]
  31. }
  32. }
  33. ]
  34. }
  35. }
このネストされたオブジェクトはクエリに一致します。その結果、検索はオブジェクトの親ドキュメントをヒットとして返します。
このネストされたオブジェクトはクエリに一致しません。同じドキュメント内の別のネストされたオブジェクトがクエリに一致するため、検索は依然として親ドキュメントをヒットとして返します。
  1. #### Python
  2. ``````python
  3. resp = client.search(
  4. index="my-index",
  5. query={
  6. "bool": {
  7. "must_not": [
  8. {
  9. "nested": {
  10. "path": "comments",
  11. "query": {
  12. "term": {
  13. "comments.author": "nik9000"
  14. }
  15. }
  16. }
  17. }
  18. ]
  19. }
  20. },
  21. )
  22. print(resp)
  23. `

Ruby

  1. response = client.search(
  2. index: 'my-index',
  3. body: {
  4. query: {
  5. bool: {
  6. must_not: [
  7. {
  8. nested: {
  9. path: 'comments',
  10. query: {
  11. term: {
  12. 'comments.author' => 'nik9000'
  13. }
  14. }
  15. }
  16. }
  17. ]
  18. }
  19. }
  20. }
  21. )
  22. puts response

Js

  1. const response = await client.search({
  2. index: "my-index",
  3. query: {
  4. bool: {
  5. must_not: [
  6. {
  7. nested: {
  8. path: "comments",
  9. query: {
  10. term: {
  11. "comments.author": "nik9000",
  12. },
  13. },
  14. },
  15. },
  16. ],
  17. },
  18. },
  19. });
  20. console.log(response);

コンソール

  1. POST my-index/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must_not": [
  6. {
  7. "nested": {
  8. "path": "comments",
  9. "query": {
  10. "term": {
  11. "comments.author": "nik9000"
  12. }
  13. }
  14. }
  15. }
  16. ]
  17. }
  18. }
  19. }

検索結果:

コンソール

  1. {
  2. ...
  3. "hits" : {
  4. ...
  5. "hits" : [
  6. {
  7. "_index" : "my-index",
  8. "_id" : "1",
  9. "_score" : 0.0,
  10. "_source" : {
  11. "comments" : [
  12. {
  13. "author" : "kimchy"
  14. }
  15. ]
  16. }
  17. }
  18. ]
  19. }
  20. }