検索から選択したフィールドを取得する

デフォルトでは、検索応答の各ヒットには、ドキュメント _source が含まれており、これはドキュメントをインデックスする際に提供された全体の JSON オブジェクトです。検索クエリから選択したフィールドを取得するための推奨される方法は2つあります:

  • インデックスマッピングに存在するフィールドの値を抽出するために fields オプション を使用する
  • インデックス時に渡された元のデータにアクセスする必要がある場合は _source オプション を使用する

これらの方法の両方を使用できますが、fields オプションが推奨されます。なぜなら、これはドキュメントデータとインデックスマッピングの両方を参照するからです。場合によっては、データを取得するための 他の方法 を使用したいかもしれません。

フィールドオプション

検索応答で特定のフィールドを取得するには、fields パラメータを使用します。インデックスマッピングを参照するため、fields パラメータは _source を直接参照するよりもいくつかの利点を提供します。具体的には、fields パラメータは:

ignore_above](/read/elasticsearch-8-15/08fcc03dd0dd2bdc.md)、ignore_malformed、および null_value を含む他のマッピングオプションも尊重されます。

fields オプションは、Elasticsearch がそれらをインデックスする方法に一致する形で値を返します。標準フィールドの場合、これは fields オプションが _source を見て値を見つけ、その後マッピングを使用して解析およびフォーマットすることを意味します。_source で見つからない選択されたフィールドはスキップされます。

特定のフィールドを取得する

次の検索リクエストは、fields パラメータを使用して user.id フィールド、http.response. で始まるすべてのフィールド、および @timestamp フィールドの値を取得します。

オブジェクト表記を使用して、format 引数を渡して、返される日付または地理空間値のフォーマットをカスタマイズできます。

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. query={
  4. "match": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. fields=[
  9. "user.id",
  10. "http.response.*",
  11. {
  12. "field": "@timestamp",
  13. "format": "epoch_millis"
  14. }
  15. ],
  16. source=False,
  17. )
  18. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. body: {
  4. query: {
  5. match: {
  6. 'user.id' => 'kimchy'
  7. }
  8. },
  9. fields: [
  10. 'user.id',
  11. 'http.response.*',
  12. {
  13. field: '@timestamp',
  14. format: 'epoch_millis'
  15. }
  16. ],
  17. _source: false
  18. }
  19. )
  20. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. query: {
  4. match: {
  5. "user.id": "kimchy",
  6. },
  7. },
  8. fields: [
  9. "user.id",
  10. "http.response.*",
  11. {
  12. field: "@timestamp",
  13. format: "epoch_millis",
  14. },
  15. ],
  16. _source: false,
  17. });
  18. console.log(response);

コンソール

  1. POST my-index-000001/_search
  2. {
  3. "query": {
  4. "match": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. "fields": [
  9. "user.id",
  10. "http.response.*",
  11. {
  12. "field": "@timestamp",
  13. "format": "epoch_millis"
  14. }
  15. ],
  16. "_source": false
  17. }
フルフィールド名とワイルドカードパターンの両方が受け入れられます。
フィールドの値にカスタムフォーマットを適用するには、format パラメータを使用します。

デフォルトでは、_id_index のようなドキュメントメタデータフィールドは、要求された fields オプションが * のようなワイルドカードパターンを使用している場合、返されません。ただし、フィールド名を使用して明示的に要求された場合、_id_routing_ignored_index および _version メタデータフィールドを取得できます。

応答は常に配列を返す

fields 応答は常に各フィールドの値の配列を返します。_source に単一の値がある場合でも、これは Elasticsearch に専用の配列タイプがないためであり、任意のフィールドには複数の値が含まれる可能性があります。fields パラメータも、配列の値が特定の順序で返されることを保証しません。詳細については、配列 に関するマッピングドキュメントを参照してください。

応答には、各ヒットの fields セクションにフラットリストとして値が含まれます。fields パラメータは全体のオブジェクトを取得しないため、リーフフィールドのみが返されます。

コンソール-結果

  1. {
  2. "hits" : {
  3. "total" : {
  4. "value" : 1,
  5. "relation" : "eq"
  6. },
  7. "max_score" : 1.0,
  8. "hits" : [
  9. {
  10. "_index" : "my-index-000001",
  11. "_id" : "0",
  12. "_score" : 1.0,
  13. "fields" : {
  14. "user.id" : [
  15. "kimchy"
  16. ],
  17. "@timestamp" : [
  18. "4098435132000"
  19. ],
  20. "http.response.bytes": [
  21. 1070000
  22. ],
  23. "http.response.status_code": [
  24. 200
  25. ]
  26. }
  27. }
  28. ]
  29. }
  30. }

ネストされたフィールドを取得する

詳細

fields フィールドの応答は、通常のオブジェクトフィールドの応答とはわずかに異なります。通常の object フィールド内のリーフ値はフラットリストとして返されますが、nested フィールド内の値は、元のネストされた配列内の各オブジェクトの独立性を維持するためにグループ化されます。ネストされたフィールド配列内の各エントリについて、値は再びフラットリストとして返されますが、親ネストされたオブジェクト内に他の nested フィールドがある場合は、同じ手順が再度深いネストされたフィールドに対して繰り返されます。

user がネストされたフィールドである次のマッピングを考慮し、次のドキュメントをインデックスした後、user フィールドの下のすべてのフィールドを取得します:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "group": {
  6. "type": "keyword"
  7. },
  8. "user": {
  9. "type": "nested",
  10. "properties": {
  11. "first": {
  12. "type": "keyword"
  13. },
  14. "last": {
  15. "type": "keyword"
  16. }
  17. }
  18. }
  19. }
  20. },
  21. )
  22. print(resp)
  23. resp1 = client.index(
  24. index="my-index-000001",
  25. id="1",
  26. refresh=True,
  27. document={
  28. "group": "fans",
  29. "user": [
  30. {
  31. "first": "John",
  32. "last": "Smith"
  33. },
  34. {
  35. "first": "Alice",
  36. "last": "White"
  37. }
  38. ]
  39. },
  40. )
  41. print(resp1)
  42. resp2 = client.search(
  43. index="my-index-000001",
  44. fields=[
  45. "*"
  46. ],
  47. source=False,
  48. )
  49. print(resp2)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. group: {
  7. type: 'keyword'
  8. },
  9. user: {
  10. type: 'nested',
  11. properties: {
  12. first: {
  13. type: 'keyword'
  14. },
  15. last: {
  16. type: 'keyword'
  17. }
  18. }
  19. }
  20. }
  21. }
  22. }
  23. )
  24. puts response
  25. response = client.index(
  26. index: 'my-index-000001',
  27. id: 1,
  28. refresh: true,
  29. body: {
  30. group: 'fans',
  31. user: [
  32. {
  33. first: 'John',
  34. last: 'Smith'
  35. },
  36. {
  37. first: 'Alice',
  38. last: 'White'
  39. }
  40. ]
  41. }
  42. )
  43. puts response
  44. response = client.search(
  45. index: 'my-index-000001',
  46. body: {
  47. fields: [
  48. '*'
  49. ],
  50. _source: false
  51. }
  52. )
  53. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. group: {
  6. type: "keyword",
  7. },
  8. user: {
  9. type: "nested",
  10. properties: {
  11. first: {
  12. type: "keyword",
  13. },
  14. last: {
  15. type: "keyword",
  16. },
  17. },
  18. },
  19. },
  20. },
  21. });
  22. console.log(response);
  23. const response1 = await client.index({
  24. index: "my-index-000001",
  25. id: 1,
  26. refresh: "true",
  27. document: {
  28. group: "fans",
  29. user: [
  30. {
  31. first: "John",
  32. last: "Smith",
  33. },
  34. {
  35. first: "Alice",
  36. last: "White",
  37. },
  38. ],
  39. },
  40. });
  41. console.log(response1);
  42. const response2 = await client.search({
  43. index: "my-index-000001",
  44. fields: ["*"],
  45. _source: false,
  46. });
  47. console.log(response2);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "group" : { "type" : "keyword" },
  6. "user": {
  7. "type": "nested",
  8. "properties": {
  9. "first" : { "type" : "keyword" },
  10. "last" : { "type" : "keyword" }
  11. }
  12. }
  13. }
  14. }
  15. }
  16. PUT my-index-000001/_doc/1?refresh=true
  17. {
  18. "group" : "fans",
  19. "user" : [
  20. {
  21. "first" : "John",
  22. "last" : "Smith"
  23. },
  24. {
  25. "first" : "Alice",
  26. "last" : "White"
  27. }
  28. ]
  29. }
  30. POST my-index-000001/_search
  31. {
  32. "fields": ["*"],
  33. "_source": false
  34. }

応答は firstlast 名をグループ化し、フラットリストとして返すのではなく、

コンソール-結果

  1. {
  2. "took": 2,
  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": 1.0,
  16. "hits": [{
  17. "_index": "my-index-000001",
  18. "_id": "1",
  19. "_score": 1.0,
  20. "fields": {
  21. "group" : ["fans"],
  22. "user": [{
  23. "first": ["John"],
  24. "last": ["Smith"]
  25. },
  26. {
  27. "first": ["Alice"],
  28. "last": ["White"]
  29. }
  30. ]
  31. }
  32. }]
  33. }
  34. }

ネストされたフィールドは、そのネストされたパスによってグループ化され、取得するために使用されるパターンに関係なく、たとえば、前の例から user.first フィールドのみをクエリする場合:

Python

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

Ruby

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

Js

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

コンソール

  1. POST my-index-000001/_search
  2. {
  3. "fields": ["user.first"],
  4. "_source": false
  5. }

応答はユーザーのファーストネームのみを返しますが、ネストされた user 配列の構造は維持されます:

コンソール-結果

  1. {
  2. "took": 2,
  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": 1.0,
  16. "hits": [{
  17. "_index": "my-index-000001",
  18. "_id": "1",
  19. "_score": 1.0,
  20. "fields": {
  21. "user": [{
  22. "first": ["John"]
  23. },
  24. {
  25. "first": ["Alice"]
  26. }
  27. ]
  28. }
  29. }]
  30. }
  31. }

ただし、fields パターンがネストされた user フィールドを直接ターゲットにすると、値は返されません。なぜなら、パターンがリーフフィールドと一致しないからです。

マッピングされていないフィールドを取得する

詳細

デフォルトでは、fields パラメータはマッピングされたフィールドの値のみを返します。ただし、Elasticsearch は、_sourcefalse に設定したり、enabled: false を持つオブジェクトフィールドを使用したりして、マッピングされていないフィールドを _source に保存することを許可します。これらのオプションは、オブジェクトコンテンツの解析とインデックスを無効にします。

_source からのオブジェクト内のマッピングされていないフィールドを取得するには、include_unmapped オプションを fields セクションで使用します:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "enabled": False
  5. },
  6. )
  7. print(resp)
  8. resp1 = client.index(
  9. index="my-index-000001",
  10. id="1",
  11. refresh=True,
  12. document={
  13. "user_id": "kimchy",
  14. "session_data": {
  15. "object": {
  16. "some_field": "some_value"
  17. }
  18. }
  19. },
  20. )
  21. print(resp1)
  22. resp2 = client.search(
  23. index="my-index-000001",
  24. fields=[
  25. "user_id",
  26. {
  27. "field": "session_data.object.*",
  28. "include_unmapped": True
  29. }
  30. ],
  31. source=False,
  32. )
  33. print(resp2)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. enabled: false
  6. }
  7. }
  8. )
  9. puts response
  10. response = client.index(
  11. index: 'my-index-000001',
  12. id: 1,
  13. refresh: true,
  14. body: {
  15. user_id: 'kimchy',
  16. session_data: {
  17. object: {
  18. some_field: 'some_value'
  19. }
  20. }
  21. }
  22. )
  23. puts response
  24. response = client.search(
  25. index: 'my-index-000001',
  26. body: {
  27. fields: [
  28. 'user_id',
  29. {
  30. field: 'session_data.object.*',
  31. include_unmapped: true
  32. }
  33. ],
  34. _source: false
  35. }
  36. )
  37. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. enabled: false,
  5. },
  6. });
  7. console.log(response);
  8. const response1 = await client.index({
  9. index: "my-index-000001",
  10. id: 1,
  11. refresh: "true",
  12. document: {
  13. user_id: "kimchy",
  14. session_data: {
  15. object: {
  16. some_field: "some_value",
  17. },
  18. },
  19. },
  20. });
  21. console.log(response1);
  22. const response2 = await client.search({
  23. index: "my-index-000001",
  24. fields: [
  25. "user_id",
  26. {
  27. field: "session_data.object.*",
  28. include_unmapped: true,
  29. },
  30. ],
  31. _source: false,
  32. });
  33. console.log(response2);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "enabled": false
  5. }
  6. }
  7. PUT my-index-000001/_doc/1?refresh=true
  8. {
  9. "user_id": "kimchy",
  10. "session_data": {
  11. "object": {
  12. "some_field": "some_value"
  13. }
  14. }
  15. }
  16. POST my-index-000001/_search
  17. {
  18. "fields": [
  19. "user_id",
  20. {
  21. "field": "session_data.object.*",
  22. "include_unmapped" : true
  23. }
  24. ],
  25. "_source": false
  26. }
すべてのマッピングを無効にします。
このフィールドパターンに一致するマッピングされていないフィールドを含めます。

応答には、session_data.object.* パスの下にフィールド結果が含まれます。フィールドがマッピングされていなくても。user_id フィールドもマッピングされていませんが、include_unmapped がそのフィールドパターンに対して true に設定されていないため、応答には含まれません。

コンソール-結果

  1. {
  2. "took" : 2,
  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" : 1.0,
  16. "hits" : [
  17. {
  18. "_index" : "my-index-000001",
  19. "_id" : "1",
  20. "_score" : 1.0,
  21. "fields" : {
  22. "session_data.object.some_field": [
  23. "some_value"
  24. ]
  25. }
  26. }
  27. ]
  28. }
  29. }

無視されたフィールド値

詳細

fields セクションの応答は、インデックス時に有効だった値のみを返します。検索リクエストが、形式が不正または大きすぎるために無視されたフィールドの値を要求する場合、これらの値は ignored_field_values セクションに別途返されます。

この例では、無視され、インデックスに追加されなかった値を持つドキュメントをインデックスします。したがって、検索結果に別途表示されます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "my-small": {
  6. "type": "keyword",
  7. "ignore_above": 2
  8. },
  9. "my-large": {
  10. "type": "keyword"
  11. }
  12. }
  13. },
  14. )
  15. print(resp)
  16. resp1 = client.index(
  17. index="my-index-000001",
  18. id="1",
  19. refresh=True,
  20. document={
  21. "my-small": [
  22. "ok",
  23. "bad"
  24. ],
  25. "my-large": "ok content"
  26. },
  27. )
  28. print(resp1)
  29. resp2 = client.search(
  30. index="my-index-000001",
  31. fields=[
  32. "my-*"
  33. ],
  34. source=False,
  35. )
  36. print(resp2)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. "my-small": {
  7. type: 'keyword',
  8. ignore_above: 2
  9. },
  10. "my-large": {
  11. type: 'keyword'
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response
  18. response = client.index(
  19. index: 'my-index-000001',
  20. id: 1,
  21. refresh: true,
  22. body: {
  23. "my-small": [
  24. 'ok',
  25. 'bad'
  26. ],
  27. "my-large": 'ok content'
  28. }
  29. )
  30. puts response
  31. response = client.search(
  32. index: 'my-index-000001',
  33. body: {
  34. fields: [
  35. 'my-*'
  36. ],
  37. _source: false
  38. }
  39. )
  40. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. "my-small": {
  6. type: "keyword",
  7. ignore_above: 2,
  8. },
  9. "my-large": {
  10. type: "keyword",
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);
  16. const response1 = await client.index({
  17. index: "my-index-000001",
  18. id: 1,
  19. refresh: "true",
  20. document: {
  21. "my-small": ["ok", "bad"],
  22. "my-large": "ok content",
  23. },
  24. });
  25. console.log(response1);
  26. const response2 = await client.search({
  27. index: "my-index-000001",
  28. fields: ["my-*"],
  29. _source: false,
  30. });
  31. console.log(response2);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "my-small" : { "type" : "keyword", "ignore_above": 2 },
  6. "my-large" : { "type" : "keyword" }
  7. }
  8. }
  9. }
  10. PUT my-index-000001/_doc/1?refresh=true
  11. {
  12. "my-small": ["ok", "bad"],
  13. "my-large": "ok content"
  14. }
  15. POST my-index-000001/_search
  16. {
  17. "fields": ["my-*"],
  18. "_source": false
  19. }
このフィールドにはサイズ制限があります。
このドキュメントフィールドにはサイズ制限を超える値があるため、無視され、インデックスされません。

応答には、ignored_field_values パスの下に無視されたフィールド値が含まれます。これらの値はドキュメントの元の JSON ソースから取得され、未加工であり、成功裏にインデックスされたフィールドとは異なり、フォーマットされたり処理されたりすることはありません。fields セクションで返されます。

コンソール-結果

  1. {
  2. "took" : 2,
  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" : 1.0,
  16. "hits" : [
  17. {
  18. "_index" : "my-index-000001",
  19. "_id" : "1",
  20. "_score" : 1.0,
  21. "_ignored" : [ "my-small"],
  22. "fields" : {
  23. "my-large": [
  24. "ok content"
  25. ],
  26. "my-small": [
  27. "ok"
  28. ]
  29. },
  30. "ignored_field_values" : {
  31. "my-small": [
  32. "bad"
  33. ]
  34. }
  35. }
  36. ]
  37. }
  38. }

ソースオプション

_source パラメータを使用して、返されるソースのフィールドを選択できます。これは ソースフィルタリング と呼ばれます。

次の検索 API リクエストは、_source リクエストボディパラメータを false に設定します。ドキュメントソースは応答に含まれません。

Python

  1. resp = client.search(
  2. source=False,
  3. query={
  4. "match": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. _source: false,
  4. query: {
  5. match: {
  6. 'user.id' => 'kimchy'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. _source: false,
  3. query: {
  4. match: {
  5. "user.id": "kimchy",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "_source": false,
  4. "query": {
  5. "match": {
  6. "user.id": "kimchy"
  7. }
  8. }
  9. }

ソースフィールドのサブセットのみを返すには、* パラメータにワイルドカード (*) パターンを指定します。次の検索 API リクエストは、obj フィールドとそのプロパティのソースを返します。

Python

  1. resp = client.search(
  2. source="obj.*",
  3. query={
  4. "match": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. _source: 'obj.*',
  4. query: {
  5. match: {
  6. 'user.id' => 'kimchy'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. _source: "obj.*",
  3. query: {
  4. match: {
  5. "user.id": "kimchy",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "_source": "obj.*",
  4. "query": {
  5. "match": {
  6. "user.id": "kimchy"
  7. }
  8. }
  9. }

_source フィールドにワイルドカードパターンの配列を指定することもできます。次の検索 API リクエストは、obj1 および obj2 フィールドとそのプロパティのソースを返します。

Python

  1. resp = client.search(
  2. source=[
  3. "obj1.*",
  4. "obj2.*"
  5. ],
  6. query={
  7. "match": {
  8. "user.id": "kimchy"
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. _source: [
  4. 'obj1.*',
  5. 'obj2.*'
  6. ],
  7. query: {
  8. match: {
  9. 'user.id' => 'kimchy'
  10. }
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.search({
  2. _source: ["obj1.*", "obj2.*"],
  3. query: {
  4. match: {
  5. "user.id": "kimchy",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "_source": [ "obj1.*", "obj2.*" ],
  4. "query": {
  5. "match": {
  6. "user.id": "kimchy"
  7. }
  8. }
  9. }

より細かい制御を行うには、_source パラメータに includes および excludes パターンの配列を含むオブジェクトを指定できます。

includes プロパティが指定されている場合、そのパターンのいずれかに一致するソースフィールドのみが返されます。このサブセットからフィールドを除外するには、excludes プロパティを使用できます。

includes プロパティが指定されていない場合、excludes プロパティに一致するパターンのフィールドを除外して、ドキュメントソース全体が返されます。

次の検索 API リクエストは、obj1 および obj2 フィールドとそのプロパティのソースを返し、子 description フィールドは除外します。

Python

  1. resp = client.search(
  2. source={
  3. "includes": [
  4. "obj1.*",
  5. "obj2.*"
  6. ],
  7. "excludes": [
  8. "*.description"
  9. ]
  10. },
  11. query={
  12. "term": {
  13. "user.id": "kimchy"
  14. }
  15. },
  16. )
  17. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. _source: {
  4. includes: [
  5. 'obj1.*',
  6. 'obj2.*'
  7. ],
  8. excludes: [
  9. '*.description'
  10. ]
  11. },
  12. query: {
  13. term: {
  14. 'user.id' => 'kimchy'
  15. }
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.search({
  2. _source: {
  3. includes: ["obj1.*", "obj2.*"],
  4. excludes: ["*.description"],
  5. },
  6. query: {
  7. term: {
  8. "user.id": "kimchy",
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "_source": {
  4. "includes": [ "obj1.*", "obj2.*" ],
  5. "excludes": [ "*.description" ]
  6. },
  7. "query": {
  8. "term": {
  9. "user.id": "kimchy"
  10. }
  11. }
  12. }

データを取得する他の方法

fields を使用する方が通常は良い

これらのオプションは通常必要ありません。fields オプションを使用する方が通常は良い選択です。ストレージされた docvalue_fields を強制的に読み込む必要がある場合を除きます。

ドキュメントの _source は、Lucene に単一のフィールドとして保存されます。この構造により、_source オブジェクト全体を読み込んで解析する必要があります。たとえその一部だけを要求している場合でも。この制限を回避するために、フィールドを読み込むための他のオプションを試すことができます:

  • 選択したフィールドの値を取得するために docvalue_fields パラメータを使用します。これは、キーワードや日付など、doc 値をサポートする比較的小さな数のフィールドを返す場合に良い選択です。
  • 特定のストレージされたフィールドの値を取得するために stored_fields パラメータを使用します(store マッピングオプションを使用するフィールド)。

Elasticsearch は常に _source から値を読み込もうとします。この動作は、Elasticsearch が単一のフィールドを取得するために _source 全体を読み込んで解析する必要があるというソースフィルタリングの同じ影響を持ちます。

ドキュメント値フィールド

docvalue_fields パラメータを使用して、検索応答の1つまたは複数のフィールドの ドキュメント値 を返すことができます。

ドキュメント値は、_source と同じ値を保存しますが、ソートや集計に最適化されたディスク上の列ベースの構造で保存されます。各フィールドは別々に保存されるため、Elasticsearch は要求されたフィールド値のみを読み込み、ドキュメント _source 全体を読み込むのを避けることができます。

ドキュメント値は、デフォルトでサポートされているフィールドに保存されます。ただし、text または text_annotated フィールドにはドキュメント値はサポートされていません。

次の検索リクエストは、docvalue_fields パラメータを使用して、user.id フィールド、http.response. で始まるすべてのフィールド、および @timestamp フィールドのドキュメント値を取得します:

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. query={
  4. "match": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. docvalue_fields=[
  9. "user.id",
  10. "http.response.*",
  11. {
  12. "field": "date",
  13. "format": "epoch_millis"
  14. }
  15. ],
  16. )
  17. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. body: {
  4. query: {
  5. match: {
  6. 'user.id' => 'kimchy'
  7. }
  8. },
  9. docvalue_fields: [
  10. 'user.id',
  11. 'http.response.*',
  12. {
  13. field: 'date',
  14. format: 'epoch_millis'
  15. }
  16. ]
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. query: {
  4. match: {
  5. "user.id": "kimchy",
  6. },
  7. },
  8. docvalue_fields: [
  9. "user.id",
  10. "http.response.*",
  11. {
  12. field: "date",
  13. format: "epoch_millis",
  14. },
  15. ],
  16. });
  17. console.log(response);

コンソール

  1. GET my-index-000001/_search
  2. {
  3. "query": {
  4. "match": {
  5. "user.id": "kimchy"
  6. }
  7. },
  8. "docvalue_fields": [
  9. "user.id",
  10. "http.response.*",
  11. {
  12. "field": "date",
  13. "format": "epoch_millis"
  14. }
  15. ]
  16. }
フルフィールド名とワイルドカードパターンの両方が受け入れられます。
オブジェクト表記を使用して、フィールドのドキュメント値にカスタム
フォーマットを適用するために format パラメータを渡すことができます。日付フィールド は、
日付 format をサポートします。数値フィールド は、
DecimalFormat\
パターン
をサポートします。他のフィールドデータ型は format パラメータをサポートしていません。

docvalue_fields パラメータを使用してネストされたオブジェクトのドキュメント値を取得することはできません。ネストされたオブジェクトを指定すると、検索はそのフィールドに対して空の配列 ([ ]) を返します。ネストされたフィールドにアクセスするには、inner_hits パラメータの docvalue_fields プロパティを使用する必要があります。

ストレージフィールド

個々のフィールドの値を store マッピングオプションを使用して保存することも可能です。stored_fields パラメータを使用して、これらの保存された値を検索応答に含めることができます。

stored_fields パラメータは、マッピングで明示的に保存されているとマークされたフィールド用であり、デフォルトではオフになっており、一般的には推奨されません。代わりに、返される元のソースドキュメントのサブセットを選択するために ソースフィルタリング を使用してください。

検索ヒットによって表される各ドキュメントの特定の保存されたフィールドを選択的に読み込むことを許可します。

Python

  1. resp = client.search(
  2. stored_fields=[
  3. "user",
  4. "postDate"
  5. ],
  6. query={
  7. "term": {
  8. "user": "kimchy"
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. stored_fields: [
  4. 'user',
  5. 'postDate'
  6. ],
  7. query: {
  8. term: {
  9. user: 'kimchy'
  10. }
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.search({
  2. stored_fields: ["user", "postDate"],
  3. query: {
  4. term: {
  5. user: "kimchy",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "stored_fields" : ["user", "postDate"],
  4. "query" : {
  5. "term" : { "user" : "kimchy" }
  6. }
  7. }

* を使用してドキュメントからすべての保存されたフィールドを読み込むことができます。

空の配列は、各ヒットの _id および _type のみを返すことになります。たとえば:

Python

  1. resp = client.search(
  2. stored_fields=[],
  3. query={
  4. "term": {
  5. "user": "kimchy"
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. stored_fields: [],
  4. query: {
  5. term: {
  6. user: 'kimchy'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. stored_fields: [],
  3. query: {
  4. term: {
  5. user: "kimchy",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "stored_fields" : [],
  4. "query" : {
  5. "term" : { "user" : "kimchy" }
  6. }
  7. }

要求されたフィールドが保存されていない場合(store マッピングが false に設定されている場合)、それらは無視されます。

ドキュメント自体から取得された保存されたフィールド値は常に配列として返されます。対照的に、_routing のようなメタデータフィールドは、決して配列として返されません。

また、stored_fields オプションを介して返されるのはリーフフィールドのみです。オブジェクトフィールドが指定されている場合、それは無視されます。

stored_fields 自体はネストされたオブジェクトのフィールドを読み込むために使用できません。フィールドがそのパスにネストされたオブジェクトを含む場合、その保存されたフィールドに対してデータは返されません。ネストされたフィールドにアクセスするには、stored_fields ブロック内で使用する必要があります。

保存されたフィールドを無効にする

保存されたフィールド(およびメタデータフィールド)を完全に無効にするには、_none_ を使用します:

Python

  1. resp = client.search(
  2. stored_fields="_none_",
  3. query={
  4. "term": {
  5. "user": "kimchy"
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. stored_fields: '_none_',
  4. query: {
  5. term: {
  6. user: 'kimchy'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. stored_fields: "_none_",
  3. query: {
  4. term: {
  5. user: "kimchy",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "stored_fields": "_none_",
  4. "query" : {
  5. "term" : { "user" : "kimchy" }
  6. }
  7. }

_source および version パラメータは、_none_ が使用されている場合は有効にできません。

スクリプトフィールド

script_fields パラメータを使用して、各ヒットの スクリプト評価 を取得できます。たとえば:

Python

  1. resp = client.search(
  2. query={
  3. "match_all": {}
  4. },
  5. script_fields={
  6. "test1": {
  7. "script": {
  8. "lang": "painless",
  9. "source": "doc['price'].value * 2"
  10. }
  11. },
  12. "test2": {
  13. "script": {
  14. "lang": "painless",
  15. "source": "doc['price'].value * params.factor",
  16. "params": {
  17. "factor": 2
  18. }
  19. }
  20. }
  21. },
  22. )
  23. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. match_all: {}
  5. },
  6. script_fields: {
  7. "test1": {
  8. script: {
  9. lang: 'painless',
  10. source: "doc['price'].value * 2"
  11. }
  12. },
  13. "test2": {
  14. script: {
  15. lang: 'painless',
  16. source: "doc['price'].value * params.factor",
  17. params: {
  18. factor: 2
  19. }
  20. }
  21. }
  22. }
  23. }
  24. )
  25. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. match_all: {},
  4. },
  5. script_fields: {
  6. test1: {
  7. script: {
  8. lang: "painless",
  9. source: "doc['price'].value * 2",
  10. },
  11. },
  12. test2: {
  13. script: {
  14. lang: "painless",
  15. source: "doc['price'].value * params.factor",
  16. params: {
  17. factor: 2,
  18. },
  19. },
  20. },
  21. },
  22. });
  23. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "script_fields": {
  7. "test1": {
  8. "script": {
  9. "lang": "painless",
  10. "source": "doc['price'].value * 2"
  11. }
  12. },
  13. "test2": {
  14. "script": {
  15. "lang": "painless",
  16. "source": "doc['price'].value * params.factor",
  17. "params": {
  18. "factor": 2.0
  19. }
  20. }
  21. }
  22. }
  23. }

スクリプトフィールドは、保存されていないフィールド(上記の price の場合)で機能し、カスタム値を返すことを許可します(スクリプトの評価値)。

スクリプトフィールドは、実際の _source ドキュメントにアクセスし、params['_source'] を使用してそこから返される特定の要素を抽出することもできます。以下はその例です:

Python

  1. resp = client.search(
  2. query={
  3. "match_all": {}
  4. },
  5. script_fields={
  6. "test1": {
  7. "script": "params['_source']['message']"
  8. }
  9. },
  10. )
  11. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. match_all: {}
  5. },
  6. script_fields: {
  7. "test1": {
  8. script: "params['_source']['message']"
  9. }
  10. }
  11. }
  12. )
  13. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. match_all: {},
  4. },
  5. script_fields: {
  6. test1: {
  7. script: "params['_source']['message']",
  8. },
  9. },
  10. });
  11. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "script_fields": {
  7. "test1": {
  8. "script": "params['_source']['message']"
  9. }
  10. }
  11. }

ここでの _source キーワードに注意して、json のようなモデルをナビゲートします。

doc['my_field'].valueparams['_source']['my_field'] の違いを理解することが重要です。最初のものは、ドキュメントキーワードを使用して、そのフィールドの用語がメモリに読み込まれる(キャッシュされる)ため、実行が速くなりますが、メモリ消費が増加します。また、doc[...] 表記は、単純な値フィールドのみを許可し(json オブジェクトを返すことはできません)、分析されていないか単一の用語に基づくフィールドにのみ意味があります。ただし、doc を使用することは、可能であれば、ドキュメントから値にアクセスするための推奨方法です。_source は、使用されるたびに読み込まれ、解析されなければならないためです。_source を使用するのは非常に遅いです。