_source field
_source
フィールドには、インデックス時に渡された元の JSON ドキュメントの本文が含まれています。 _source
フィールド自体はインデックスされていないため(検索可能ではありません)、fetch リクエストを実行する際に返されるように保存されています。たとえば、get や search です。
ディスク使用量が重要な場合は、次のオプションを検討してください:
- 合成
_source
を使用することで、ディスクに保存するのではなく、取得時にソースコンテンツを再構築します。これによりディスク使用量が縮小されますが、Get および Search クエリで_source
へのアクセスが遅くなります。 _source
フィールドを完全に無効にすることです(2d831942eb078a15.md#disable-source-field)。これによりディスク使用量が縮小されますが、_source
に依存する機能が無効になります。
Synthetic _source
合成 _source
は、一般的に TSDB インデックス(index.mode
が time_series
に設定されているインデックス)のみで利用可能です。他のインデックスでは、合成 _source
は技術プレビュー中です。技術プレビューの機能は、将来のリリースで変更または削除される可能性があります。Elastic は問題を修正するために取り組みますが、技術プレビューの機能は公式 GA 機能のサポート SLA の対象ではありません。
非常に便利ですが、ソースフィールドはディスク上でかなりのスペースを占有します。Elasticsearch は、送信した通りにソースドキュメントをディスクに保存するのではなく、取得時にソースコンテンツをその場で再構築できます。これを有効にするには、mode: synthetic
を _source
に設定します:
Python
resp = client.indices.create(
index="idx",
mappings={
"_source": {
"mode": "synthetic"
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'idx',
body: {
mappings: {
_source: {
mode: 'synthetic'
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "idx",
mappings: {
_source: {
mode: "synthetic",
},
},
});
console.log(response);
Console
PUT idx
{
"mappings": {
"_source": {
"mode": "synthetic"
}
}
}
この場での再構築は、ソースドキュメントをそのまま保存してクエリ時に読み込むよりも一般的に遅くなりますが、ストレージスペースを大幅に節約します。必要ない場合は、クエリで _source
フィールドを読み込まないことで追加のレイテンシを回避できます。
Supported fields
合成 _source
はすべてのフィールドタイプでサポートされています。実装の詳細に応じて、フィールドタイプは合成 _source
と一緒に使用されるときに異なるプロパティを持ちます。
ほとんどのフィールドタイプ は、既存のデータを使用して合成 _source
を構築します。最も一般的なのは doc_values
と stored 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
resp = client.index(
index="idx",
id="1",
document={
"foo": [
{
"bar": 1
},
{
"bar": 2
}
]
},
)
print(resp)
Ruby
response = client.index(
index: 'idx',
id: 1,
body: {
foo: [
{
bar: 1
},
{
bar: 2
}
]
}
)
puts response
Js
const response = await client.index({
index: "idx",
id: 1,
document: {
foo: [
{
bar: 1,
},
{
bar: 2,
},
],
},
});
console.log(response);
Console
PUT idx/_doc/1
{
"foo": [
{
"bar": 1
},
{
"bar": 2
}
]
}
Console-Result
{
"foo": {
"bar": [1, 2]
}
}
これにより、一部の配列が消える可能性があります:
Python
resp = client.index(
index="idx",
id="1",
document={
"foo": [
{
"bar": 1
},
{
"baz": 2
}
]
},
)
print(resp)
Ruby
response = client.index(
index: 'idx',
id: 1,
body: {
foo: [
{
bar: 1
},
{
baz: 2
}
]
}
)
puts response
Js
const response = await client.index({
index: "idx",
id: 1,
document: {
foo: [
{
bar: 1,
},
{
baz: 2,
},
],
},
});
console.log(response);
Console
PUT idx/_doc/1
{
"foo": [
{
"bar": 1
},
{
"baz": 2
}
]
}
Console-Result
{
"foo": {
"bar": 1,
"baz": 2
}
}
Fields named as they are mapped
合成ソースは、マッピングで名前が付けられたとおりにフィールド名を付けます。動的マッピング と一緒に使用される場合、名前にドット(.
)が含まれるフィールドは、デフォルトで複数のオブジェクトとして解釈されますが、subobjects
が無効になっているオブジェクト内では、フィールド名のドットは保持されます。たとえば:
Python
resp = client.index(
index="idx",
id="1",
document={
"foo.bar.baz": 1
},
)
print(resp)
Js
const response = await client.index({
index: "idx",
id: 1,
document: {
"foo.bar.baz": 1,
},
});
console.log(response);
Console
PUT idx/_doc/1
{
"foo.bar.baz": 1
}
Console-Result
{
"foo": {
"bar": {
"baz": 1
}
}
}
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
設定を有効にすると、これらのタイプの無視されたフィールド値を保存するために追加のストレージが必要になります。
aggregate_metric_double
annotated-text
binary
boolean
byte
date
date_nanos
dense_vector
double
flattened
float
geo_point
half_float
histogram
integer
ip
keyword
long
range
タイプscaled_float
short
text
version
wildcard
Disabling the _source field
非常に便利ですが、ソースフィールドはインデックス内でストレージオーバーヘッドを引き起こします。このため、次のように無効にすることができます:
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"_source": {
"enabled": False
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
_source: {
enabled: false
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
_source: {
enabled: false,
},
},
});
console.log(response);
Console
PUT my-index-000001
{
"mappings": {
"_source": {
"enabled": false
}
}
}
Think before disabling the _source field
ユーザーはしばしば _source
フィールドを無思慮に無効にし、その結果を後悔します。_source
フィールドが利用できない場合、いくつかの機能がサポートされなくなります:
update
、update_by_query
、およびreindex
API。- Kibana Discover アプリケーションでは、フィールドデータが表示されません。
- オンザフライの ハイライト。
- 1 つの Elasticsearch インデックスから別のインデックスに再インデックスする能力、マッピングや分析を変更するため、またはインデックスを新しいメジャーバージョンにアップグレードするため。
- インデックス時に使用された元のドキュメントを表示することによるクエリや集計のデバッグ能力。
- 将来的には、インデックスの破損を自動的に修復する能力。
ディスクスペースが懸念される場合は、_source
を無効にするのではなく、圧縮レベル を増やす方が良いでしょう。
Including / Excluding fields from _source
専門家専用の機能として、ドキュメントがインデックスされた後、_source
フィールドの内容をプルーニングする能力がありますが、_source
フィールドが保存される前に行います。
_source
からフィールドを削除することは、_source
を無効にすることと同様の欠点があります。特に、1 つの Elasticsearch インデックスから別のインデックスにドキュメントを再インデックスできなくなるという事実です。代わりに ソースフィルタリング を使用することを検討してください。
includes
/excludes
パラメータ(ワイルドカードも受け入れます)は、次のように使用できます:
Python
resp = client.indices.create(
index="logs",
mappings={
"_source": {
"includes": [
"*.count",
"meta.*"
],
"excludes": [
"meta.description",
"meta.other.*"
]
}
},
)
print(resp)
resp1 = client.index(
index="logs",
id="1",
document={
"requests": {
"count": 10,
"foo": "bar"
},
"meta": {
"name": "Some metric",
"description": "Some metric description",
"other": {
"foo": "one",
"baz": "two"
}
}
},
)
print(resp1)
resp2 = client.search(
index="logs",
query={
"match": {
"meta.other.foo": "one"
}
},
)
print(resp2)
Ruby
response = client.indices.create(
index: 'logs',
body: {
mappings: {
_source: {
includes: [
'*.count',
'meta.*'
],
excludes: [
'meta.description',
'meta.other.*'
]
}
}
}
)
puts response
response = client.index(
index: 'logs',
id: 1,
body: {
requests: {
count: 10,
foo: 'bar'
},
meta: {
name: 'Some metric',
description: 'Some metric description',
other: {
foo: 'one',
baz: 'two'
}
}
}
)
puts response
response = client.search(
index: 'logs',
body: {
query: {
match: {
'meta.other.foo' => 'one'
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "logs",
mappings: {
_source: {
includes: ["*.count", "meta.*"],
excludes: ["meta.description", "meta.other.*"],
},
},
});
console.log(response);
const response1 = await client.index({
index: "logs",
id: 1,
document: {
requests: {
count: 10,
foo: "bar",
},
meta: {
name: "Some metric",
description: "Some metric description",
other: {
foo: "one",
baz: "two",
},
},
},
});
console.log(response1);
const response2 = await client.search({
index: "logs",
query: {
match: {
"meta.other.foo": "one",
},
},
});
console.log(response2);
Console
PUT logs
{
"mappings": {
"_source": {
"includes": [
"*.count",
"meta.*"
],
"excludes": [
"meta.description",
"meta.other.*"
]
}
}
}
PUT logs/_doc/1
{
"requests": {
"count": 10,
"foo": "bar"
},
"meta": {
"name": "Some metric",
"description": "Some metric description",
"other": {
"foo": "one",
"baz": "two"
}
}
}
GET logs/_search
{
"query": {
"match": {
"meta.other.foo": "one"
}
}
}
これらのフィールドは保存された _source フィールドから削除されます。 |
|
保存された _source に含まれていなくても、このフィールドで検索することはできます。 |