ランタイムフィールドを取得する

fields パラメータを _search API で使用して、ランタイムフィールドの値を取得します。ランタイムフィールドは _source に表示されませんが、fields API は、元の _source の一部として送信されなかったフィールドを含むすべてのフィールドに対して機能します。

曜日を計算するランタイムフィールドを定義する

例えば、以下のリクエストは day_of_week というランタイムフィールドを追加します。このランタイムフィールドには、@timestamp フィールドの値に基づいて曜日を計算するスクリプトが含まれています。新しいフィールドがランタイムフィールドとしてマッピングに追加されるように、リクエストに "dynamic":"runtime" を含めます。

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "dynamic": "runtime",
  5. "runtime": {
  6. "day_of_week": {
  7. "type": "keyword",
  8. "script": {
  9. "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))"
  10. }
  11. }
  12. },
  13. "properties": {
  14. "@timestamp": {
  15. "type": "date"
  16. }
  17. }
  18. },
  19. )
  20. print(resp)

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic: "runtime",
  5. runtime: {
  6. day_of_week: {
  7. type: "keyword",
  8. script: {
  9. source:
  10. "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))",
  11. },
  12. },
  13. },
  14. properties: {
  15. "@timestamp": {
  16. type: "date",
  17. },
  18. },
  19. },
  20. });
  21. console.log(response);

Console

  1. PUT my-index-000001/
  2. {
  3. "mappings": {
  4. "dynamic": "runtime",
  5. "runtime": {
  6. "day_of_week": {
  7. "type": "keyword",
  8. "script": {
  9. "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))"
  10. }
  11. }
  12. },
  13. "properties": {
  14. "@timestamp": {"type": "date"}
  15. }
  16. }
  17. }

データを取り込む

サンプルデータを取り込み、@timestampmessage の2つのインデックスフィールドを生成します。

Python

  1. resp = client.bulk(
  2. index="my-index-000001",
  3. refresh=True,
  4. operations=[
  5. {
  6. "index": {}
  7. },
  8. {
  9. "@timestamp": "2020-06-21T15:00:01-05:00",
  10. "message": "211.11.9.0 - - [2020-06-21T15:00:01-05:00] \"GET /english/index.html HTTP/1.0\" 304 0"
  11. },
  12. {
  13. "index": {}
  14. },
  15. {
  16. "@timestamp": "2020-06-21T15:00:01-05:00",
  17. "message": "211.11.9.0 - - [2020-06-21T15:00:01-05:00] \"GET /english/index.html HTTP/1.0\" 304 0"
  18. },
  19. {
  20. "index": {}
  21. },
  22. {
  23. "@timestamp": "2020-04-30T14:30:17-05:00",
  24. "message": "40.135.0.0 - - [2020-04-30T14:30:17-05:00] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"
  25. },
  26. {
  27. "index": {}
  28. },
  29. {
  30. "@timestamp": "2020-04-30T14:30:53-05:00",
  31. "message": "232.0.0.0 - - [2020-04-30T14:30:53-05:00] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"
  32. },
  33. {
  34. "index": {}
  35. },
  36. {
  37. "@timestamp": "2020-04-30T14:31:12-05:00",
  38. "message": "26.1.0.0 - - [2020-04-30T14:31:12-05:00] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"
  39. },
  40. {
  41. "index": {}
  42. },
  43. {
  44. "@timestamp": "2020-04-30T14:31:19-05:00",
  45. "message": "247.37.0.0 - - [2020-04-30T14:31:19-05:00] \"GET /french/splash_inet.html HTTP/1.0\" 200 3781"
  46. },
  47. {
  48. "index": {}
  49. },
  50. {
  51. "@timestamp": "2020-04-30T14:31:27-05:00",
  52. "message": "252.0.0.0 - - [2020-04-30T14:31:27-05:00] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"
  53. },
  54. {
  55. "index": {}
  56. },
  57. {
  58. "@timestamp": "2020-04-30T14:31:29-05:00",
  59. "message": "247.37.0.0 - - [2020-04-30T14:31:29-05:00] \"GET /images/hm_brdl.gif HTTP/1.0\" 304 0"
  60. },
  61. {
  62. "index": {}
  63. },
  64. {
  65. "@timestamp": "2020-04-30T14:31:29-05:00",
  66. "message": "247.37.0.0 - - [2020-04-30T14:31:29-05:00] \"GET /images/hm_arw.gif HTTP/1.0\" 304 0"
  67. },
  68. {
  69. "index": {}
  70. },
  71. {
  72. "@timestamp": "2020-04-30T14:31:32-05:00",
  73. "message": "247.37.0.0 - - [2020-04-30T14:31:32-05:00] \"GET /images/nav_bg_top.gif HTTP/1.0\" 200 929"
  74. },
  75. {
  76. "index": {}
  77. },
  78. {
  79. "@timestamp": "2020-04-30T14:31:43-05:00",
  80. "message": "247.37.0.0 - - [2020-04-30T14:31:43-05:00] \"GET /french/images/nav_venue_off.gif HTTP/1.0\" 304 0"
  81. }
  82. ],
  83. )
  84. print(resp)

Ruby

  1. response = client.bulk(
  2. index: 'my-index-000001',
  3. refresh: true,
  4. body: [
  5. {
  6. index: {}
  7. },
  8. {
  9. "@timestamp": '2020-06-21T15:00:01-05:00',
  10. message: '211.11.9.0 - - [2020-06-21T15:00:01-05:00] "GET /english/index.html HTTP/1.0" 304 0'
  11. },
  12. {
  13. index: {}
  14. },
  15. {
  16. "@timestamp": '2020-06-21T15:00:01-05:00',
  17. message: '211.11.9.0 - - [2020-06-21T15:00:01-05:00] "GET /english/index.html HTTP/1.0" 304 0'
  18. },
  19. {
  20. index: {}
  21. },
  22. {
  23. "@timestamp": '2020-04-30T14:30:17-05:00',
  24. message: '40.135.0.0 - - [2020-04-30T14:30:17-05:00] "GET /images/hm_bg.jpg HTTP/1.0" 200 24736'
  25. },
  26. {
  27. index: {}
  28. },
  29. {
  30. "@timestamp": '2020-04-30T14:30:53-05:00',
  31. message: '232.0.0.0 - - [2020-04-30T14:30:53-05:00] "GET /images/hm_bg.jpg HTTP/1.0" 200 24736'
  32. },
  33. {
  34. index: {}
  35. },
  36. {
  37. "@timestamp": '2020-04-30T14:31:12-05:00',
  38. message: '26.1.0.0 - - [2020-04-30T14:31:12-05:00] "GET /images/hm_bg.jpg HTTP/1.0" 200 24736'
  39. },
  40. {
  41. index: {}
  42. },
  43. {
  44. "@timestamp": '2020-04-30T14:31:19-05:00',
  45. message: '247.37.0.0 - - [2020-04-30T14:31:19-05:00] "GET /french/splash_inet.html HTTP/1.0" 200 3781'
  46. },
  47. {
  48. index: {}
  49. },
  50. {
  51. "@timestamp": '2020-04-30T14:31:27-05:00',
  52. message: '252.0.0.0 - - [2020-04-30T14:31:27-05:00] "GET /images/hm_bg.jpg HTTP/1.0" 200 24736'
  53. },
  54. {
  55. index: {}
  56. },
  57. {
  58. "@timestamp": '2020-04-30T14:31:29-05:00',
  59. message: '247.37.0.0 - - [2020-04-30T14:31:29-05:00] "GET /images/hm_brdl.gif HTTP/1.0" 304 0'
  60. },
  61. {
  62. index: {}
  63. },
  64. {
  65. "@timestamp": '2020-04-30T14:31:29-05:00',
  66. message: '247.37.0.0 - - [2020-04-30T14:31:29-05:00] "GET /images/hm_arw.gif HTTP/1.0" 304 0'
  67. },
  68. {
  69. index: {}
  70. },
  71. {
  72. "@timestamp": '2020-04-30T14:31:32-05:00',
  73. message: '247.37.0.0 - - [2020-04-30T14:31:32-05:00] "GET /images/nav_bg_top.gif HTTP/1.0" 200 929'
  74. },
  75. {
  76. index: {}
  77. },
  78. {
  79. "@timestamp": '2020-04-30T14:31:43-05:00',
  80. message: '247.37.0.0 - - [2020-04-30T14:31:43-05:00] "GET /french/images/nav_venue_off.gif HTTP/1.0" 304 0'
  81. }
  82. ]
  83. )
  84. puts response

Js

  1. const response = await client.bulk({
  2. index: "my-index-000001",
  3. refresh: "true",
  4. operations: [
  5. {
  6. index: {},
  7. },
  8. {
  9. "@timestamp": "2020-06-21T15:00:01-05:00",
  10. message:
  11. '211.11.9.0 - - [2020-06-21T15:00:01-05:00] "GET /english/index.html HTTP/1.0" 304 0',
  12. },
  13. {
  14. index: {},
  15. },
  16. {
  17. "@timestamp": "2020-06-21T15:00:01-05:00",
  18. message:
  19. '211.11.9.0 - - [2020-06-21T15:00:01-05:00] "GET /english/index.html HTTP/1.0" 304 0',
  20. },
  21. {
  22. index: {},
  23. },
  24. {
  25. "@timestamp": "2020-04-30T14:30:17-05:00",
  26. message:
  27. '40.135.0.0 - - [2020-04-30T14:30:17-05:00] "GET /images/hm_bg.jpg HTTP/1.0" 200 24736',
  28. },
  29. {
  30. index: {},
  31. },
  32. {
  33. "@timestamp": "2020-04-30T14:30:53-05:00",
  34. message:
  35. '232.0.0.0 - - [2020-04-30T14:30:53-05:00] "GET /images/hm_bg.jpg HTTP/1.0" 200 24736',
  36. },
  37. {
  38. index: {},
  39. },
  40. {
  41. "@timestamp": "2020-04-30T14:31:12-05:00",
  42. message:
  43. '26.1.0.0 - - [2020-04-30T14:31:12-05:00] "GET /images/hm_bg.jpg HTTP/1.0" 200 24736',
  44. },
  45. {
  46. index: {},
  47. },
  48. {
  49. "@timestamp": "2020-04-30T14:31:19-05:00",
  50. message:
  51. '247.37.0.0 - - [2020-04-30T14:31:19-05:00] "GET /french/splash_inet.html HTTP/1.0" 200 3781',
  52. },
  53. {
  54. index: {},
  55. },
  56. {
  57. "@timestamp": "2020-04-30T14:31:27-05:00",
  58. message:
  59. '252.0.0.0 - - [2020-04-30T14:31:27-05:00] "GET /images/hm_bg.jpg HTTP/1.0" 200 24736',
  60. },
  61. {
  62. index: {},
  63. },
  64. {
  65. "@timestamp": "2020-04-30T14:31:29-05:00",
  66. message:
  67. '247.37.0.0 - - [2020-04-30T14:31:29-05:00] "GET /images/hm_brdl.gif HTTP/1.0" 304 0',
  68. },
  69. {
  70. index: {},
  71. },
  72. {
  73. "@timestamp": "2020-04-30T14:31:29-05:00",
  74. message:
  75. '247.37.0.0 - - [2020-04-30T14:31:29-05:00] "GET /images/hm_arw.gif HTTP/1.0" 304 0',
  76. },
  77. {
  78. index: {},
  79. },
  80. {
  81. "@timestamp": "2020-04-30T14:31:32-05:00",
  82. message:
  83. '247.37.0.0 - - [2020-04-30T14:31:32-05:00] "GET /images/nav_bg_top.gif HTTP/1.0" 200 929',
  84. },
  85. {
  86. index: {},
  87. },
  88. {
  89. "@timestamp": "2020-04-30T14:31:43-05:00",
  90. message:
  91. '247.37.0.0 - - [2020-04-30T14:31:43-05:00] "GET /french/images/nav_venue_off.gif HTTP/1.0" 304 0',
  92. },
  93. ],
  94. });
  95. console.log(response);

Console

  1. POST /my-index-000001/_bulk?refresh
  2. { "index": {}}
  3. { "@timestamp": "2020-06-21T15:00:01-05:00", "message" : "211.11.9.0 - - [2020-06-21T15:00:01-05:00] \"GET /english/index.html HTTP/1.0\" 304 0"}
  4. { "index": {}}
  5. { "@timestamp": "2020-06-21T15:00:01-05:00", "message" : "211.11.9.0 - - [2020-06-21T15:00:01-05:00] \"GET /english/index.html HTTP/1.0\" 304 0"}
  6. { "index": {}}
  7. { "@timestamp": "2020-04-30T14:30:17-05:00", "message" : "40.135.0.0 - - [2020-04-30T14:30:17-05:00] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"}
  8. { "index": {}}
  9. { "@timestamp": "2020-04-30T14:30:53-05:00", "message" : "232.0.0.0 - - [2020-04-30T14:30:53-05:00] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"}
  10. { "index": {}}
  11. { "@timestamp": "2020-04-30T14:31:12-05:00", "message" : "26.1.0.0 - - [2020-04-30T14:31:12-05:00] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"}
  12. { "index": {}}
  13. { "@timestamp": "2020-04-30T14:31:19-05:00", "message" : "247.37.0.0 - - [2020-04-30T14:31:19-05:00] \"GET /french/splash_inet.html HTTP/1.0\" 200 3781"}
  14. { "index": {}}
  15. { "@timestamp": "2020-04-30T14:31:27-05:00", "message" : "252.0.0.0 - - [2020-04-30T14:31:27-05:00] \"GET /images/hm_bg.jpg HTTP/1.0\" 200 24736"}
  16. { "index": {}}
  17. { "@timestamp": "2020-04-30T14:31:29-05:00", "message" : "247.37.0.0 - - [2020-04-30T14:31:29-05:00] \"GET /images/hm_brdl.gif HTTP/1.0\" 304 0"}
  18. { "index": {}}
  19. { "@timestamp": "2020-04-30T14:31:29-05:00", "message" : "247.37.0.0 - - [2020-04-30T14:31:29-05:00] \"GET /images/hm_arw.gif HTTP/1.0\" 304 0"}
  20. { "index": {}}
  21. { "@timestamp": "2020-04-30T14:31:32-05:00", "message" : "247.37.0.0 - - [2020-04-30T14:31:32-05:00] \"GET /images/nav_bg_top.gif HTTP/1.0\" 200 929"}
  22. { "index": {}}
  23. { "@timestamp": "2020-04-30T14:31:43-05:00", "message" : "247.37.0.0 - - [2020-04-30T14:31:43-05:00] \"GET /french/images/nav_venue_off.gif HTTP/1.0\" 304 0"}

計算された曜日を検索する

以下のリクエストは、元のリクエストでマッピング内のランタイムフィールドとして定義された day_of_week フィールドを取得するために検索APIを使用します。このフィールドの値は、ドキュメントを再インデックス化したり、day_of_week フィールドをインデックス化したりすることなく、クエリ時に動的に計算されます。この柔軟性により、フィールドの値を変更することなくマッピングを変更できます。

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. fields=[
  4. "@timestamp",
  5. "day_of_week"
  6. ],
  7. source=False,
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. body: {
  4. fields: [
  5. '@timestamp',
  6. 'day_of_week'
  7. ],
  8. _source: false
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. fields: ["@timestamp", "day_of_week"],
  4. _source: false,
  5. });
  6. console.log(response);

Console

  1. GET my-index-000001/_search
  2. {
  3. "fields": [
  4. "@timestamp",
  5. "day_of_week"
  6. ],
  7. "_source": false
  8. }

前のリクエストは、すべての一致するドキュメントに対して day_of_week フィールドを返します。client_ip という別のランタイムフィールドを定義することもでき、message フィールドに対しても操作し、クエリをさらに絞り込むことができます:

Python

  1. resp = client.indices.put_mapping(
  2. index="my-index-000001",
  3. runtime={
  4. "client_ip": {
  5. "type": "ip",
  6. "script": {
  7. "source": "String m = doc[\"message\"].value; int end = m.indexOf(\" \"); emit(m.substring(0, end));"
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.indices.put_mapping(
  2. index: 'my-index-000001',
  3. body: {
  4. runtime: {
  5. client_ip: {
  6. type: 'ip',
  7. script: {
  8. source: 'String m = doc["message"].value; int end = m.indexOf(" "); emit(m.substring(0, end));'
  9. }
  10. }
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.indices.putMapping({
  2. index: "my-index-000001",
  3. runtime: {
  4. client_ip: {
  5. type: "ip",
  6. script: {
  7. source:
  8. 'String m = doc["message"].value; int end = m.indexOf(" "); emit(m.substring(0, end));',
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

Console

  1. PUT /my-index-000001/_mapping
  2. {
  3. "runtime": {
  4. "client_ip": {
  5. "type": "ip",
  6. "script" : {
  7. "source" : "String m = doc[\"message\"].value; int end = m.indexOf(\" \"); emit(m.substring(0, end));"
  8. }
  9. }
  10. }
  11. }

別のクエリを実行しますが、client_ip ランタイムフィールドを使用して特定のIPアドレスを検索します:

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. size=1,
  4. query={
  5. "match": {
  6. "client_ip": "211.11.9.0"
  7. }
  8. },
  9. fields=[
  10. "*"
  11. ],
  12. )
  13. print(resp)

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. size: 1,
  4. query: {
  5. match: {
  6. client_ip: "211.11.9.0",
  7. },
  8. },
  9. fields: ["*"],
  10. });
  11. console.log(response);

Console

  1. GET my-index-000001/_search
  2. {
  3. "size": 1,
  4. "query": {
  5. "match": {
  6. "client_ip": "211.11.9.0"
  7. }
  8. },
  9. "fields" : ["*"]
  10. }

今回は、応答には2つのヒットのみが含まれます。day_of_week (Sunday) の値は、マッピングで定義されたランタイムスクリプトを使用してクエリ時に計算され、結果には 211.11.9.0 IPアドレスに一致するドキュメントのみが含まれます。

Console-Result

  1. {
  2. ...
  3. "hits" : {
  4. "total" : {
  5. "value" : 2,
  6. "relation" : "eq"
  7. },
  8. "max_score" : 1.0,
  9. "hits" : [
  10. {
  11. "_index" : "my-index-000001",
  12. "_id" : "oWs5KXYB-XyJbifr9mrz",
  13. "_score" : 1.0,
  14. "_source" : {
  15. "@timestamp" : "2020-06-21T15:00:01-05:00",
  16. "message" : "211.11.9.0 - - [2020-06-21T15:00:01-05:00] \"GET /english/index.html HTTP/1.0\" 304 0"
  17. },
  18. "fields" : {
  19. "@timestamp" : [
  20. "2020-06-21T20:00:01.000Z"
  21. ],
  22. "client_ip" : [
  23. "211.11.9.0"
  24. ],
  25. "message" : [
  26. "211.11.9.0 - - [2020-06-21T15:00:01-05:00] \"GET /english/index.html HTTP/1.0\" 304 0"
  27. ],
  28. "day_of_week" : [
  29. "Sunday"
  30. ]
  31. }
  32. }
  33. ]
  34. }
  35. }

関連インデックスからフィールドを取得する

この機能は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。

fields パラメータは、_search API で、lookup タイプのランタイムフィールドを介して関連インデックスからフィールドを取得するためにも使用できます。

lookup タイプのランタイムフィールドによって取得されたフィールドは、検索応答のヒットを強化するために使用できます。これらのフィールドに対してクエリや集計を行うことはできません。

Python

  1. resp = client.index(
  2. index="ip_location",
  3. refresh=True,
  4. document={
  5. "ip": "192.168.1.1",
  6. "country": "Canada",
  7. "city": "Montreal"
  8. },
  9. )
  10. print(resp)
  11. resp1 = client.index(
  12. index="logs",
  13. id="1",
  14. refresh=True,
  15. document={
  16. "host": "192.168.1.1",
  17. "message": "the first message"
  18. },
  19. )
  20. print(resp1)
  21. resp2 = client.index(
  22. index="logs",
  23. id="2",
  24. refresh=True,
  25. document={
  26. "host": "192.168.1.2",
  27. "message": "the second message"
  28. },
  29. )
  30. print(resp2)
  31. resp3 = client.search(
  32. index="logs",
  33. runtime_mappings={
  34. "location": {
  35. "type": "lookup",
  36. "target_index": "ip_location",
  37. "input_field": "host",
  38. "target_field": "ip",
  39. "fetch_fields": [
  40. "country",
  41. "city"
  42. ]
  43. }
  44. },
  45. fields=[
  46. "host",
  47. "message",
  48. "location"
  49. ],
  50. source=False,
  51. )
  52. print(resp3)

Ruby

  1. response = client.index(
  2. index: 'ip_location',
  3. refresh: true,
  4. body: {
  5. ip: '192.168.1.1',
  6. country: 'Canada',
  7. city: 'Montreal'
  8. }
  9. )
  10. puts response
  11. response = client.index(
  12. index: 'logs',
  13. id: 1,
  14. refresh: true,
  15. body: {
  16. host: '192.168.1.1',
  17. message: 'the first message'
  18. }
  19. )
  20. puts response
  21. response = client.index(
  22. index: 'logs',
  23. id: 2,
  24. refresh: true,
  25. body: {
  26. host: '192.168.1.2',
  27. message: 'the second message'
  28. }
  29. )
  30. puts response
  31. response = client.search(
  32. index: 'logs',
  33. body: {
  34. runtime_mappings: {
  35. location: {
  36. type: 'lookup',
  37. target_index: 'ip_location',
  38. input_field: 'host',
  39. target_field: 'ip',
  40. fetch_fields: [
  41. 'country',
  42. 'city'
  43. ]
  44. }
  45. },
  46. fields: [
  47. 'host',
  48. 'message',
  49. 'location'
  50. ],
  51. _source: false
  52. }
  53. )
  54. puts response

Js

  1. const response = await client.index({
  2. index: "ip_location",
  3. refresh: "true",
  4. document: {
  5. ip: "192.168.1.1",
  6. country: "Canada",
  7. city: "Montreal",
  8. },
  9. });
  10. console.log(response);
  11. const response1 = await client.index({
  12. index: "logs",
  13. id: 1,
  14. refresh: "true",
  15. document: {
  16. host: "192.168.1.1",
  17. message: "the first message",
  18. },
  19. });
  20. console.log(response1);
  21. const response2 = await client.index({
  22. index: "logs",
  23. id: 2,
  24. refresh: "true",
  25. document: {
  26. host: "192.168.1.2",
  27. message: "the second message",
  28. },
  29. });
  30. console.log(response2);
  31. const response3 = await client.search({
  32. index: "logs",
  33. runtime_mappings: {
  34. location: {
  35. type: "lookup",
  36. target_index: "ip_location",
  37. input_field: "host",
  38. target_field: "ip",
  39. fetch_fields: ["country", "city"],
  40. },
  41. },
  42. fields: ["host", "message", "location"],
  43. _source: false,
  44. });
  45. console.log(response3);

Console

  1. POST ip_location/_doc?refresh
  2. {
  3. "ip": "192.168.1.1",
  4. "country": "Canada",
  5. "city": "Montreal"
  6. }
  7. PUT logs/_doc/1?refresh
  8. {
  9. "host": "192.168.1.1",
  10. "message": "the first message"
  11. }
  12. PUT logs/_doc/2?refresh
  13. {
  14. "host": "192.168.1.2",
  15. "message": "the second message"
  16. }
  17. POST logs/_search
  18. {
  19. "runtime_mappings": {
  20. "location": {
  21. "type": "lookup",
  22. "target_index": "ip_location",
  23. "input_field": "host",
  24. "target_field": "ip",
  25. "fetch_fields": ["country", "city"]
  26. }
  27. },
  28. "fields": [
  29. "host",
  30. "message",
  31. "location"
  32. ],
  33. "_source": false
  34. }
lookup クエリを使用してターゲットインデックスからフィールドを取得するランタイムフィールドをメイン検索リクエストで定義します。
ルックアップクエリが実行されるターゲットインデックス
ルックアップタームクエリの入力値として使用されるメインインデックスのフィールド
ルックアップクエリが検索するルックアップインデックスのフィールド
ルックアップインデックスから取得するフィールドのリスト。検索リクエストの fields パラメータを参照してください。

上記の検索は、返された検索ヒットの各IPアドレスに対して ip_location インデックスから国と都市を返します。

Console-Result

  1. {
  2. "took": 3,
  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": 2,
  13. "relation": "eq"
  14. },
  15. "max_score": 1.0,
  16. "hits": [
  17. {
  18. "_index": "logs",
  19. "_id": "1",
  20. "_score": 1.0,
  21. "fields": {
  22. "host": [ "192.168.1.1" ],
  23. "location": [
  24. {
  25. "city": [ "Montreal" ],
  26. "country": [ "Canada" ]
  27. }
  28. ],
  29. "message": [ "the first message" ]
  30. }
  31. },
  32. {
  33. "_index": "logs",
  34. "_id": "2",
  35. "_score": 1.0,
  36. "fields": {
  37. "host": [ "192.168.1.2" ],
  38. "message": [ "the second message" ]
  39. }
  40. }
  41. ]
  42. }
  43. }

ルックアップフィールドの応答は、ルックアップインデックスから各ドキュメントの独立性を維持するためにグループ化されます。各入力値のルックアップクエリは、ルックアップインデックス上で最大1つのドキュメントに一致することが期待されます。ルックアップクエリが複数のドキュメントに一致する場合、ランダムなドキュメントが選択されます。