_source field

_source フィールドには、インデックス時に渡された元の JSON ドキュメントの本文が含まれています。 _source フィールド自体はインデックスされていないため(検索可能ではありません)、fetch リクエストを実行する際に返されるように保存されています。たとえば、getsearch です。

ディスク使用量が重要な場合は、次のオプションを検討してください:

  • 合成 _source を使用することで、ディスクに保存するのではなく、取得時にソースコンテンツを再構築します。これによりディスク使用量が縮小されますが、Get および Search クエリで _source へのアクセスが遅くなります。
  • _source フィールドを完全に無効にすることです(2d831942eb078a15.md#disable-source-field)。これによりディスク使用量が縮小されますが、_source に依存する機能が無効になります。

Synthetic _source

合成 _source は、一般的に TSDB インデックス(index.modetime_series に設定されているインデックス)のみで利用可能です。他のインデックスでは、合成 _source は技術プレビュー中です。技術プレビューの機能は、将来のリリースで変更または削除される可能性があります。Elastic は問題を修正するために取り組みますが、技術プレビューの機能は公式 GA 機能のサポート SLA の対象ではありません。

非常に便利ですが、ソースフィールドはディスク上でかなりのスペースを占有します。Elasticsearch は、送信した通りにソースドキュメントをディスクに保存するのではなく、取得時にソースコンテンツをその場で再構築できます。これを有効にするには、mode: synthetic_source に設定します:

Python

  1. resp = client.indices.create(
  2. index="idx",
  3. mappings={
  4. "_source": {
  5. "mode": "synthetic"
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'idx',
  3. body: {
  4. mappings: {
  5. _source: {
  6. mode: 'synthetic'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.indices.create({
  2. index: "idx",
  3. mappings: {
  4. _source: {
  5. mode: "synthetic",
  6. },
  7. },
  8. });
  9. console.log(response);

Console

  1. PUT idx
  2. {
  3. "mappings": {
  4. "_source": {
  5. "mode": "synthetic"
  6. }
  7. }
  8. }

この場での再構築は、ソースドキュメントをそのまま保存してクエリ時に読み込むよりも一般的に遅くなりますが、ストレージスペースを大幅に節約します。必要ない場合は、クエリで _source フィールドを読み込まないことで追加のレイテンシを回避できます。

Supported fields

合成 _source はすべてのフィールドタイプでサポートされています。実装の詳細に応じて、フィールドタイプは合成 _source と一緒に使用されるときに異なるプロパティを持ちます。

ほとんどのフィールドタイプ は、既存のデータを使用して合成 _source を構築します。最も一般的なのは doc_valuesstored fields です。これらのフィールドタイプでは、_source フィールドの内容を保存するために追加のスペースは必要ありません。doc_values のストレージレイアウトのため、生成された _source フィールドは元のドキュメントと比較して 変更 を受けます。

他のすべてのフィールドタイプでは、フィールドの元の値はそのまま保存され、非合成モードの _source フィールドと同じ方法で保存されます。この場合、変更はなく、_source のフィールドデータは元のドキュメントと同じです。同様に、ignore_malformed または ignore_above を使用するフィールドの不正な値はそのまま保存する必要があります。このアプローチは、_source 再構築に必要なデータがフィールドをインデックスするために必要な他のデータ(doc_values など)に加えて保存されるため、ストレージ効率が低くなります。

Synthetic _source restrictions

合成 _source は、copy_to を使用するフィールドマッピングと一緒に使用することはできません。

一部のフィールドタイプには追加の制限があります。これらの制限は、フィールドタイプの ドキュメント合成 _source セクションに記載されています。

Synthetic _source modifications

合成 _source が有効な場合、取得されたドキュメントは元の JSON と比較していくつかの変更を受けます。

Arrays moved to leaf fields

合成 _source 配列はリーフに移動されます。たとえば:

Python

  1. resp = client.index(
  2. index="idx",
  3. id="1",
  4. document={
  5. "foo": [
  6. {
  7. "bar": 1
  8. },
  9. {
  10. "bar": 2
  11. }
  12. ]
  13. },
  14. )
  15. print(resp)

Ruby

  1. response = client.index(
  2. index: 'idx',
  3. id: 1,
  4. body: {
  5. foo: [
  6. {
  7. bar: 1
  8. },
  9. {
  10. bar: 2
  11. }
  12. ]
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.index({
  2. index: "idx",
  3. id: 1,
  4. document: {
  5. foo: [
  6. {
  7. bar: 1,
  8. },
  9. {
  10. bar: 2,
  11. },
  12. ],
  13. },
  14. });
  15. console.log(response);

Console

  1. PUT idx/_doc/1
  2. {
  3. "foo": [
  4. {
  5. "bar": 1
  6. },
  7. {
  8. "bar": 2
  9. }
  10. ]
  11. }

次のようになります:

Console-Result

  1. {
  2. "foo": {
  3. "bar": [1, 2]
  4. }
  5. }

これにより、一部の配列が消える可能性があります:

Python

  1. resp = client.index(
  2. index="idx",
  3. id="1",
  4. document={
  5. "foo": [
  6. {
  7. "bar": 1
  8. },
  9. {
  10. "baz": 2
  11. }
  12. ]
  13. },
  14. )
  15. print(resp)

Ruby

  1. response = client.index(
  2. index: 'idx',
  3. id: 1,
  4. body: {
  5. foo: [
  6. {
  7. bar: 1
  8. },
  9. {
  10. baz: 2
  11. }
  12. ]
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.index({
  2. index: "idx",
  3. id: 1,
  4. document: {
  5. foo: [
  6. {
  7. bar: 1,
  8. },
  9. {
  10. baz: 2,
  11. },
  12. ],
  13. },
  14. });
  15. console.log(response);

Console

  1. PUT idx/_doc/1
  2. {
  3. "foo": [
  4. {
  5. "bar": 1
  6. },
  7. {
  8. "baz": 2
  9. }
  10. ]
  11. }

次のようになります:

Console-Result

  1. {
  2. "foo": {
  3. "bar": 1,
  4. "baz": 2
  5. }
  6. }

Fields named as they are mapped

合成ソースは、マッピングで名前が付けられたとおりにフィールド名を付けます。動的マッピング と一緒に使用される場合、名前にドット(.)が含まれるフィールドは、デフォルトで複数のオブジェクトとして解釈されますが、subobjects が無効になっているオブジェクト内では、フィールド名のドットは保持されます。たとえば:

Python

  1. resp = client.index(
  2. index="idx",
  3. id="1",
  4. document={
  5. "foo.bar.baz": 1
  6. },
  7. )
  8. print(resp)

Js

  1. const response = await client.index({
  2. index: "idx",
  3. id: 1,
  4. document: {
  5. "foo.bar.baz": 1,
  6. },
  7. });
  8. console.log(response);

Console

  1. PUT idx/_doc/1
  2. {
  3. "foo.bar.baz": 1
  4. }

次のようになります:

Console-Result

  1. {
  2. "foo": {
  3. "bar": {
  4. "baz": 1
  5. }
  6. }
  7. }

Alphabetical sorting

合成 _source フィールドはアルファベット順にソートされます。JSON RFC はオブジェクトを「ゼロまたはそれ以上の名前/値ペアの無秩序なコレクション」と定義しているため、アプリケーションは気にする必要はありませんが、合成 _source がない場合は元の順序が保持され、一部のアプリケーションは仕様に反してその順序で何かを行う可能性があります。

Representation of ranges

範囲フィールド値(例:long_range)は、常に両側が含まれるように表現され、境界が適切に調整されます。を参照してください。

Reduced precision of geo_point values

geo_point フィールドの値は、合成 _source で精度が低く表現されます。を参照してください。

Field types that support synthetic source with no storage overhead

次のフィールドタイプは、doc_values または stored fields からのデータを使用して合成ソースをサポートし、_source フィールドを構築するために追加のストレージスペースを必要としません。

ignore_malformed または ignore_above 設定を有効にすると、これらのタイプの無視されたフィールド値を保存するために追加のストレージが必要になります。

Disabling the _source field

非常に便利ですが、ソースフィールドはインデックス内でストレージオーバーヘッドを引き起こします。このため、次のように無効にすることができます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "_source": {
  5. "enabled": False
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. _source: {
  6. enabled: false
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. _source: {
  5. enabled: false,
  6. },
  7. },
  8. });
  9. console.log(response);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "_source": {
  5. "enabled": false
  6. }
  7. }
  8. }

Think before disabling the _source field

ユーザーはしばしば _source フィールドを無思慮に無効にし、その結果を後悔します。_source フィールドが利用できない場合、いくつかの機能がサポートされなくなります:

  • updateupdate_by_query、および reindex API。
  • Kibana Discover アプリケーションでは、フィールドデータが表示されません。
  • オンザフライの ハイライト
  • 1 つの Elasticsearch インデックスから別のインデックスに再インデックスする能力、マッピングや分析を変更するため、またはインデックスを新しいメジャーバージョンにアップグレードするため。
  • インデックス時に使用された元のドキュメントを表示することによるクエリや集計のデバッグ能力。
  • 将来的には、インデックスの破損を自動的に修復する能力。

ディスクスペースが懸念される場合は、_source を無効にするのではなく、圧縮レベル を増やす方が良いでしょう。

Including / Excluding fields from _source

専門家専用の機能として、ドキュメントがインデックスされた後、_source フィールドの内容をプルーニングする能力がありますが、_source フィールドが保存される前に行います。

_source からフィールドを削除することは、_source を無効にすることと同様の欠点があります。特に、1 つの Elasticsearch インデックスから別のインデックスにドキュメントを再インデックスできなくなるという事実です。代わりに ソースフィルタリング を使用することを検討してください。

includes/excludes パラメータ(ワイルドカードも受け入れます)は、次のように使用できます:

Python

  1. resp = client.indices.create(
  2. index="logs",
  3. mappings={
  4. "_source": {
  5. "includes": [
  6. "*.count",
  7. "meta.*"
  8. ],
  9. "excludes": [
  10. "meta.description",
  11. "meta.other.*"
  12. ]
  13. }
  14. },
  15. )
  16. print(resp)
  17. resp1 = client.index(
  18. index="logs",
  19. id="1",
  20. document={
  21. "requests": {
  22. "count": 10,
  23. "foo": "bar"
  24. },
  25. "meta": {
  26. "name": "Some metric",
  27. "description": "Some metric description",
  28. "other": {
  29. "foo": "one",
  30. "baz": "two"
  31. }
  32. }
  33. },
  34. )
  35. print(resp1)
  36. resp2 = client.search(
  37. index="logs",
  38. query={
  39. "match": {
  40. "meta.other.foo": "one"
  41. }
  42. },
  43. )
  44. print(resp2)

Ruby

  1. response = client.indices.create(
  2. index: 'logs',
  3. body: {
  4. mappings: {
  5. _source: {
  6. includes: [
  7. '*.count',
  8. 'meta.*'
  9. ],
  10. excludes: [
  11. 'meta.description',
  12. 'meta.other.*'
  13. ]
  14. }
  15. }
  16. }
  17. )
  18. puts response
  19. response = client.index(
  20. index: 'logs',
  21. id: 1,
  22. body: {
  23. requests: {
  24. count: 10,
  25. foo: 'bar'
  26. },
  27. meta: {
  28. name: 'Some metric',
  29. description: 'Some metric description',
  30. other: {
  31. foo: 'one',
  32. baz: 'two'
  33. }
  34. }
  35. }
  36. )
  37. puts response
  38. response = client.search(
  39. index: 'logs',
  40. body: {
  41. query: {
  42. match: {
  43. 'meta.other.foo' => 'one'
  44. }
  45. }
  46. }
  47. )
  48. puts response

Js

  1. const response = await client.indices.create({
  2. index: "logs",
  3. mappings: {
  4. _source: {
  5. includes: ["*.count", "meta.*"],
  6. excludes: ["meta.description", "meta.other.*"],
  7. },
  8. },
  9. });
  10. console.log(response);
  11. const response1 = await client.index({
  12. index: "logs",
  13. id: 1,
  14. document: {
  15. requests: {
  16. count: 10,
  17. foo: "bar",
  18. },
  19. meta: {
  20. name: "Some metric",
  21. description: "Some metric description",
  22. other: {
  23. foo: "one",
  24. baz: "two",
  25. },
  26. },
  27. },
  28. });
  29. console.log(response1);
  30. const response2 = await client.search({
  31. index: "logs",
  32. query: {
  33. match: {
  34. "meta.other.foo": "one",
  35. },
  36. },
  37. });
  38. console.log(response2);

Console

  1. PUT logs
  2. {
  3. "mappings": {
  4. "_source": {
  5. "includes": [
  6. "*.count",
  7. "meta.*"
  8. ],
  9. "excludes": [
  10. "meta.description",
  11. "meta.other.*"
  12. ]
  13. }
  14. }
  15. }
  16. PUT logs/_doc/1
  17. {
  18. "requests": {
  19. "count": 10,
  20. "foo": "bar"
  21. },
  22. "meta": {
  23. "name": "Some metric",
  24. "description": "Some metric description",
  25. "other": {
  26. "foo": "one",
  27. "baz": "two"
  28. }
  29. }
  30. }
  31. GET logs/_search
  32. {
  33. "query": {
  34. "match": {
  35. "meta.other.foo": "one"
  36. }
  37. }
  38. }
これらのフィールドは保存された _source フィールドから削除されます。
保存された _source に含まれていなくても、このフィールドで検索することはできます。