Elasticsearchインデックスのフィールドを表示する方法
_mapping および _search API、サブフィールド、合成 _source、およびランタイム フィールドを使用して Elasticsearch インデックスのフィールドを表示する方法を学習します。
この記事では、Elasticsearch インデックスのフィールドを表示する方法について説明します。これは、データの構造を理解し、特定のフィールドを識別し、問題をトラブルシューティングするのに役立ちます。以下のトピックを取り上げます。
_mappingAPI を使用してフィールド情報を取得する_searchAPI を使用してフィールド値を表示するサブフィールドの表示
Synthetic _source
ランタイムフィールド
1. _mapping APIを使用してフィールド情報を取得する
_mapping API を使用すると、1 つまたは複数のインデックスのマッピング定義を取得できます。これには、フィールド、そのデータ型、およびその他のプロパティに関する情報が含まれます。特定のインデックスのマッピングを取得するには、次のリクエストを使用します。
GET /<index_name>/_mappingたとえば、 my_indexという名前のインデックスがある場合、次のリクエストでそのマッピングを取得できます。
GET /my_index/_mapping応答には、フィールドとそのプロパティに関する情報を含むインデックスのマッピング定義が含まれます。
特定のフィールドのマッピングを取得することもできます。これは、マッピングが非常に大きく、特定のフィールドにのみ焦点を当てたい場合に便利です。特定のフィールドのマッピングを取得するには、次のリクエストを使用します。
GET /my_index/_mapping/field/my_field次のリクエストのように、フィールド名をコンマで区切ることで、複数のフィールドのマッピングを取得することもできます。
GET /my_index/_mapping/field/my_field_1,my_field_2,my_field_32. _search APIを使用してフィールド値を表示する
Elasticsearch インデックス内のフィールドの値を表示するには、 _search API を使用できます。_search API では、返されるフィールドを制御する方法が複数用意されています。主な方法は次の 2 つです。
_source:_sourceフィールドには、取り込みパイプラインまたは前処理手順によって行われた変更も含め、インデックスが作成されたとおりの元の JSON ドキュメント本体が含まれます。ソース ドキュメントの特定のフィールドを表示するには、以下に示すようにソース フィルタリングを実装します。fields:fieldsパラメータを使用すると、インデックス マッピングに基づいて検索を実行するときにドキュメントから特定のフィールドを取得できます。_sourceとは異なり、fields_sourceを参照せずに、保存されたフィールド、ドキュメント値、またはランタイム フィールドから値を返すこともできます。ただし、ドキュメント値や保存された設定のない標準フィールドの場合は、_sourceにフォールバックします。これによって、後述するように、パフォーマンスなど多くの利点が得られます。
_source フィールドの使用
デフォルトでは、 _search API は、インデックスが作成された元の JSON ドキュメントを含む_sourceフィールドを返します。特定のフィールドを表示するには、検索リクエストの_source パラメータにフィルターを追加できます。これはソース フィルタリングと呼ばれます。
以下は、 my_indexインデックス内のドキュメントのtitle フィールドとauthorフィールドの値を返す検索要求の例です。
GET /my_index/_search
{
"query": {
"match_all": {}
},
"_source": ["title", "author"]
}この例では、 _sourceパラメータは返されるフィールドを指定します。
さらに詳細な制御が必要な場合は、 _sourceオブジェクトのincludesプロパティとexcludes プロパティを使用できます。たとえば、次のクエリは、トップレベルのtitleフィールドと、 author.descriptionを除くauthorのすべてのサブフィールドを返します。
GET /my_index/_search
{
"query": {
"match_all": {}
},
"_source": {
“includes”: [“title”, “author.*],
“excludes”: [“author.description”]
}
}この例では、 author.* パターンを使用して、 author オブジェクトのすべての直接サブフィールドを取得します。次に、 author.description 明示的に除外して、他の著者フィールドのみが返されるようにします。ソース JSON を読み込んで解析する必要があるため、パフォーマンスは向上しませんが、ネットワーク経由で送信される応答のサイズは小さくなることに注意してください。
フィールドパラメータの使用
fieldsパラメータを使用して、検索応答で返されるフィールドをフィルタリングできます。_sourceではなくfieldsを使用すると、次のようないくつかの利点があります。
パフォーマンスの向上:
fields、_source全体をロードせずに、保存されたフィールドまたはドキュメント値から直接値を返すことができるため、応答のペイロード サイズが小さくなります。フォーマットされた出力:標準フィールドの場合、
fields値を取得するために_sourceにフォールバックすることがありますが、インデックス マッピングを参照して、フォーマットされた日付などの出力を適切にフォーマットし、集計や並べ替えに使用されるものと一貫性を保ちます。ランタイム フィールドへのアクセス:
fields、元の_sourceには存在しないランタイム フィールドを返す場合があります。さらに詳しい特典については、こちらをご覧ください。
たとえば、 my_indexインデックス内のtitleフィールドとauthorフィールドのみを返すには、次の検索リクエストを使用できます。
GET /my_index/_search
{
"query": {
"match_all": {}
},
"fields": ["title", "author"],
"_source": false
}上記のクエリでは、 _source フィールドを false に設定して、ソース ドキュメントを返さないようにします。これにより、応答のペイロード サイズを大幅に最小化できますが、これが機能するのは、フィールドtitleとauthorがkeyword フィールド タイプであり、デフォルトでdoc_values有効になっている場合のみであることに注意してください。フィールドでdoc_values有効になっておらず、 _sourceが false に設定されている場合、Elasticsearch はそれらを取得する方法がなく、応答でスキップされます。
fieldsレスポンスでは、値が 1 つしかない場合でも、常に各フィールドの値の配列が返されることに注意してください。これは、Elasticsearch に専用の配列タイプがなく、どのフィールドも複数の値を持つ可能性があるためです。Elasticsearch の配列の詳細については、ここをクリックしてください。
フィールドを取得する他の方法
_sourceまたはfieldsを使用してフィールドを取得する方法が推奨されますが、特定のユースケースでは次のような異なる方法も使用できます。
ドキュメント値フィールド: _source完全に回避したい場合は、 docvalue_fields パラメータを使用して検索できます。Doc 値は_sourceと同じフィールド値を、並べ替えと集計に最適化されたディスク上のデータ構造で保存します。
これは_sourceで保存された値とは別であるため、 _source全体をロードせずに特定のフィールドを要求できます。これは、大きなドキュメントをクエリしているが、ドキュメント値をサポートするいくつかの小さなフィールドのみが必要な場合に便利です。docvalue_fields 使用するもう 1 つのユース ケースは、以下の例に示すように、 dateとnumericフィールドでカスタム フォーマットを使用する場合です。
これは、 doc_values有効にしたフィールド、またはkeyword 、 date 、数値型、 booleanなど、デフォルトで有効になっているフィールド タイプに対してのみ機能し、 textまたはannotated_textに対しては機能しないことに注意してください。
この例では、 docvalue_fieldsパラメータを使用して、 _sourceドキュメント全体をロードせずにtitle 、 author 、およびpublishedフィールドを取得します。
GET /my_index/_search
{
"query": {
"match_all": {}
},
"docvalue_fields": [
"title",
"author",
{
"field": "published",
"format": "epoch_millis"
}
],
"_source": false
}このクエリを実行すると、Elasticsearch は各ドキュメントの_source を参照するのではなく、ディスク上の列ストアから直接値を取得します。クエリに指定されたformatパラメータにより、 publishedフィールドはデフォルトの形式ではなくepoch_millis形式で返されます。
保存されたフィールド:特定のフィールドをマッピングに保存されているものとして明示的にマークした場合は、 stored_fieldsパラメータを使用してそれらのフィールドをフィルターできます。これは、特定のフィールドのみで簡単な応答が必要な場合や、後で検索するために意図的に保存したフィールドの場合に便利です。これは_sourceとは別に保存されるため、このメソッドは_sourceをロードする必要を回避するのにも役立ちます。
このオプションはデフォルトでオフになっており、通常は推奨されないことに注意することが重要です。代わりにソース フィルタリングを使用して、元のソース ドキュメントの特定のサブセットを返します。
以下のサンプルクエリでは、 stored_fieldsパラメータを使用して、インデックス マッピング構成が「 store”: true 」であるsummaryフィールドを取得します。
GET /my_index/_search
{
"query": {
"match_all": {}
},
"stored_fields": ["summary"]
}このクエリが実行されると、Elasticsearch はこのフィールドが”store”: trueでマークされているかどうかを確認し、見つからない場合はフィールド全体をスキップします。
3. サブフィールドの表示
インデックスにサブフィールドが含まれている場合は、ドット表記を使用してfieldsパラメータでフィールド パスを指定できます。サブフィールドはネストされたフィールド タイプとは異なることに注意してください。たとえば、 address.cityという名前のサブフィールドがある場合、次のように検索応答に含めることができます。
GET /my_index/_search
{
"query": {
"match_all": {}
},
"fields": ["title", "author", "address.city"],
"_source": false
}この例では、検索応答にはtitle 、 author 、およびaddress.cityフィールドの値が含まれます。
4. 合成_ソース
_sourceを使用する機能を維持しながらディスク領域を節約したい場合は、インデックス マッピングで合成_sourceを使用するオプションがあります。合成_sourceは、 _sourceが無効になっている場合でも、Elasticsearch が保存されたフィールドやドキュメント値などの既存のデータから_sourceを再構築できるようにする機能です。これにより、再構築がオンザフライで行われるため、クエリ時の速度が若干低下しますが、多くのストレージ スペースを節約できます。インデックス設定で以下の値を使用してこの機能を有効にします。
PUT idx
{
"settings": {
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
}
}合成_source を使用する利点としては、 _search API 使用時の完全なドキュメント表示、ソース フィルタリング、 _sourceが利用可能であると想定されている Kibana などの他の機能やツールとの互換性などが挙げられますが、これらはすべて、完全な_sourceドキュメントを保存する必要性を回避しながら実現できます。
5. ランタイムフィールド
ランタイム フィールドを使用すると、クエリ時またはランタイム ブロックの下のインデックス マッピングでスクリプト フィールドを定義できます。これらのフィールドにはインデックスが付けられないため、ランタイム フィールドを追加してもインデックス サイズは増加しませんが、 _sourceには表示されません。マッピングで定義されたランタイム フィールドは永続的であり、すべてのクエリで使用できますが、クエリ時に定義されたランタイム フィールドは一時的であり、その検索要求でのみ使用できます。
ランタイム フィールドを使用する主な利点は、ドキュメントを取り込んだ後にフィールドを追加できるため、マッピングの決定が簡素化されることです。ランタイム フィールドは、文字列の書式設定やスコアの計算など、元のドキュメントには存在しないがスクリプトを使用して生成された値でドキュメントを充実させるのにも最適です。
また、結果セット内のすべてのドキュメントに対してスクリプトを実行する必要があるため、ランタイム フィールドはパフォーマンスに悪影響を与える可能性があることにも注意してください。ランタイム フィールドを取得するには、 _search API のfieldsパラメータを使用することもできます。
まとめ
Elasticsearch インデックスのフィールドの表示は、インデックス マッピングまたは_sourceを使用して単純に値を取得する方法から、 fields 、 docvalue_fields 、またはランタイム フィールドを使用して制御と効率性を高めるより高度な方法まで多岐にわたります。さまざまな方法間のトレードオフを理解することが、検索エクスペリエンスを最適化する鍵となります。ペイロードを最適化したり、ドキュメントを充実させたり、合成_sourceを使用してストレージを節約したりする場合でも、Elasticsearch は必要なデータを必要な方法で見つけるための複数のツールと機能を提供します。これらの手法は、データの構造を理解し、特定のフィールドを識別し、問題のトラブルシューティングを行うのに役立ちます。




