Elasticsearch 7.0.0 以降で作成されたインデックスは、_default_ マッピングを受け入れなくなりました。6.x で作成されたインデックスは、Elasticsearch 6.x でも以前と同様に機能し続けます。type型は、インデックス作成、putmap、getmap、puttemplate、gettemplate、および getfieldmap API に対する重大な変更により、7.0 の API では非推奨になりました。
マップされた型とは何ですか?
Elasticsearch はドキュメント データベースであり、マッピング タイプ type はインデックス付けされるドキュメントまたはエンティティのタイプを示します。たとえば、youtube インデックスにはユーザー タイプとビデオ タイプが含まれる場合があります。型はリレーショナル データベースのテーブルとして大まかに理解できます。
各マッピング タイプは独自のフィールドを持つことができるため、user ユーザー タイプには full_name フィールド、user_name フィールド、および email フィールドが含まれる可能性があり、ビデオ ビデオ タイプには video_url フィールド、uploaded_at フィールド、および user ユーザー タイプと同様のフィールドがある場合があります。 user_name フィールド。
すべてのドキュメントには、タイプ名を含む _type メタデータ フィールドがあり、URL でタイプ名を指定することで、検索を 1 つ以上のタイプに制限できます。
GET youtube/user,video/_search
{
"query": {
"match": {
"user_name": "kimchy"
}
}
}
ドキュメントの _type フィールドと _id フィールドを組み合わせると、同じインデックスに格納されている同じ _id を持つレコードとドキュメントを一意に識別するのに役立つ _uid フィールドが生成されます。
以下のコード スニペットは、異なるタイプのドキュメントが以前にどのように同じインデックスに格納されていたかを示しています (以下のコードは 7.0.0 より前のバージョンにのみ適用されることに注意してください)。
PUT youtube
{
"mappings": {
"user": {
"properties": {
"name": { "type": "text" },
"user_name": { "type": "keyword" },
"email": { "type": "keyword" }
}
},
"video": {
"properties": {
"video_url": { "type": "text" },
"user_name": { "type": "keyword" },
"uploaded_at": { "type": "date" }
}
}
}
}
上記のコードは、ユーザーとビデオの 2 つのタイプを持つ YouTube インデックスのマップを作成します。
PUT youtube/user/debraj
{
"name": "Debraj Bhal",
"user_name": "debraj",
"email": "[email protected]"
}
PUT youtube/video/1
{
"user_name": "debraj",
"uploaded_at": "2017-10-24T09:00:00Z",
"video_url": "https://myvideo.com"
}
上記のコード スニペットは、_id debraj タイプのユーザーのドキュメントと _id 1 タイプのビデオをそれぞれ作成/更新するために使用されます。
これらの特定のタイプのドキュメントは、次のコード スニペットに示すように、リクエスト URL でタイプ名を使用して取得できます。
GET youtube/video/_search
{
"query": {
"match": {
"user_name": "debraj"
}
}
}
マップされた型は非常に優れた機能を提供していたにもかかわらず、なぜ削除されたのでしょうか?
Elasticsearch では、インデックスは SQL データベースに似ており、タイプはテーブルに似ています。しかし、この例えは完全に正しくありません。SQL データベース内のテーブルは互いに独立しているため、つまり、異なるテーブルにある同じ名前のフィールドは完全に独立しており、互いに独立しています。
ただし、Elasticsearch インデックスでは、異なるマッピング タイプの同じ名前を持つフィールドは、同じ Lucene フィールドによって内部的にサポートされます。言い換えると、上記の例を使用すると、ユーザー タイプの user_name フィールドはビデオ タイプの user_name フィールドとまったく同じフィールドに格納され、両方の user_name フィールドは両方のタイプで同じマッピングを持つ必要があります (定義により、つまり、同じ)データ・タイプ)。
これにより、たとえば、ある型では日付フィールドとして定義され、同じインデックス内の別の型では bool フィールドとして定義されている削除済みフィールドを定義する場合に、失敗が発生する可能性があります。
さらに、共通フィールドがほとんどまたはまったくない型を同じインデックスに格納すると、データがまばらになり、Lucene のドキュメントを効率的に圧縮する機能が妨げられる可能性があります。たとえば、上記の例では、ユーザー名フィールドのみが共通であるため、ビデオ タイプ、電子メール、および名前タイプのフィールドは役に立たず、データがまばらになります。
マッピングタイプの代替案
マッピング タイプにはいくつかの欠点がありますが、リンクされたデータを整理するのに役立ちます。したがって、Elasticsearch でマッピング タイプが削除された後でも、次の 2 つの方法で同様の機能を実現できます。
各文書タイプの索引:
最初のオプションは、ドキュメント タイプごとに 1 つのインデックスを作成することです。ビデオとユーザーを 1 つの YouTube インデックスに保存する代わりに、ビデオをビデオ インデックスに保存し、ユーザーをユーザー インデックスに保存することもできます。
カスタムタイプフィールド:
もちろん、クラスター内に存在できるプライマリ シャードの数には制限があるため、数千のドキュメントのみを含むコレクションのためにシャード全体を無駄にしたくないでしょう。この場合、古い _type と同様に機能する独自のカスタム タイプ フィールドを実装できます。
PUT youtube
{
"mappings": {
"_doc": {
"properties": {
"type": { "type": "keyword" },
"name": { "type": "text" },
"user_name": { "type": "keyword" },
"email": { "type": "keyword" },
"video_url": { "type": "text" },
"uploaded_at": { "type": "date" }
}
}
}
}
ドキュメントのマッピング定義に、追加のフィールド タイプを追加します。このフィールドは、同じインデックスに格納されている異なる種類のドキュメントを区別するために使用されます。以下のコード スニペットに示すように、これらのドキュメントを更新およびクエリできます。
PUT youtube/_doc/user-debraj
{
"type": "user",
"name": "Debraj Bhal",
"user_name": "debraj",
"email": "[email protected]"
}
PUT youtube/_doc/video-1
{
"type": "video",
"user_name": "debraj",
"uploaded_at": "2017-10-24T09:00:00Z",
"video_url": "https://myvideo.com"
}
GET youtube/_search
{
"query": {
"bool": {
"must": {
"match": {
"user_name": "debraj"
}
},
"filter": {
"match": {
"type": "video"
}
}
}
}
}
この記事が Elasticsearch のマッピング タイプの詳細を学習するのに役立つことを願っています。