ElasticSearchのマッピングの一般的な操作

5604 ワード

このケースでは、私の前の文章『ElasticSearchのインストール及び基本操作API』を読むことをお勧めします.
Mapping(マッピング)は、リレーショナル・データベース内のテーブルの構造定義に似ています.JSON形式でElasticSearchにデータを格納した後、検索エンジンでJSONフィールドに対応するタイプをマッピングします.この場合、mappingでコンテンツのタイプを定義する必要があります.
フィールドタイプ
JSONデータ型はElasticSearch定義のタイプにマッピングされ、よく使われる簡単なタイプは以下のとおりです.
JSONタイプ
ElasticSearchタイプ
テキストの種類
Text/Keyword
整数タイプ
long/integer
浮動小数点の種類
float/double
時間タイプ
date
ブール値
boolean
はいれつ
Text/Keyword
上で注意したいのは時間タイプで、JSONには時間タイプはありません.ここでは主に時間フォーマットデータのタイプを指します.
マッピングの定義
リレーショナル・データベースでは、データを格納する前にテーブル構造を作成し、フィールドに存在するタイプを指定します.同様にElasticSearchは、データの格納を行う前に、データを格納するMapping構造を定義しておいてもよい.まず簡単なperson Mappingを定義します.
上の図にはMappingの定義があります.ElasticSearch 7の前にmappingsには_typeプロパティ.
ダイナミックマッピング
事前にMappingを定義していない場合、データを追加すると、ElasticSearchは自動的にフィールドに基づいて対応するタイプに換算しますが、換算されたタイプは必ずしも私たちが望んでいるフィールドタイプではありません.やはり、人為的な介入で希望するMappingに変更する必要があります.
マッピングの更新
dynamicを使用してマッピングが更新できるかどうかを制御します.
dynamic-true
dynamicをtrueに設定するのがデフォルトdynamicのデフォルト値で、新規フィールドデータは書き込むことができ、インデックスすることもでき、Mapping構造も更新されます.
データを追加し、定義されていないgenderフィールドを追加します.
#   person      
PUT person/_doc/1
{
  "uId": 1,
  "name": "ytao",
  "age": 18,
  "address": "      ",
  "birthday": "2020-01-15T12:00:00Z",
  "money": 108.2,
  "isStrong": true,
  "gender": " "    # Mapping        
}

追加に成功しました.genderフィールドを検索します.
Mapping構造の表示:
新しく追加されたフィールド値は、追加中に自動的に追加されます.
dynamic-false
dynamicがfalseに設定されている場合、新規フィールドデータを書き込むことができ、インデックスされることができず、Mapping構造が更新されます.同様にdynamicをfalseに設定し、データを追加します.他の手順は上記のtrue操作と同じです.Mappingを定義し、データを追加します.検索genderフィールド:
このとき、新規フィールドデータはインデックスできませんが、データは書き込むことができます.
Mappnigも新しいフィールドを追加しません.
dynamic-strict
dynamicがstrictに設定されている場合、字面上の意味からも分かるように、ダイナミックマッピングには厳格であり、新規フィールドデータは書き込むことができず、インデックスされることができず、Mapping構造は更新されない.定義されたMapping構造に従ってのみデータを追加できます.新しいフィールドデータを追加すると、すぐに例外が放出されます.
日付タイプの自動認識
上記では、dynamicがtrueに設定されている場合、新しいフィールドデータ自動認識タイプを追加してMappingを更新し、日付タイプであれば認識を指定できるタイプです.Personのdynamic_を指定date_formats形式:
PUT person/_mapping
{
  "dynamic_date_formats": ["yyyy/MM/dd"]
}

ここでは、複数の時間フォーマットを指定できます.personに新しいデータを追加します.todayとfirstDateです.
PUT person/_doc/2
{
  "today": "2020-01-15",
  "firstDate": "2020/01/15"
}

新しいフィールドデータを追加した後のMapping:
時間フォーマットがyyyy/MM/ddの場合は時間フォーマットとして認識できるように指定したので、todayフィールドの値がyyyy-MM-ddの場合は時間タイプとして認識できずtextタイプと判定します.
マルチフィールド
Mappingではfieldsマルチフィールドアトリビュートを定義して、異なるシーンでの実装を満たすことができます.例えばaddresstextタイプと定義され、fieldsにはkeywordタイプが定義されています.ここでは主に2つの異なる使用シーンを区別します.
  • textは、全文検索のための分詞逆インデックスを確立する.
  • keywordは、ソートおよび集約のための分詞逆インデックスを確立しません.

  • データの追加:
    #   person      
    PUT person/_doc/1
    {
      "uId": 1,
      "name": "ytao",
      "age": 18,
      "address": "      ",
      "birthday": "2020-01-15T12:00:00Z",
      "money": 108.2,
      "isStrong": true
    }

    クエリーaddressデータ.
    クエリーaddress.keywordデータ.keywordで検索した場合,分詞インデックスは確立されないため,データは取得されなかった.
    インデックスの制御
    フィールドでindexを使用して、現在のフィールドインデックスが検索できるかどうかを指定します.指定したタイプはbooleanタイプ、falseは検索不可、trueは検索可能です.先に削除する前のMapping:
    DELETE person
    nameプロパティのindexをfalseに設定するMappingを作成します.
    上記のデータを再度追加した後、nameフィールドを検索します.
    フィールドindexがfalseを設定すると、インデックスが設定されていないため、検索はインデックスを取得できません.
    NULL処理
    ElasticSearchにaddressが空のデータを追加します.
    PUT person/_doc/2
    {
      "uId": 2,
      "name": "Jack",
      "age": 22,
      "address": null,
      "birthday": "2020-01-15T12:00:00Z",
      "money": 68.7,
      "isStrong": true
    }

    検索keywordが空のデータ:
    検索は例外を返し、デフォルトではNUllの検索は許可されません.これはMappingでnull_を指定する必要があります.valueプロパティは、textタイプで宣言できません.
    検索keywordが空のデータ:"null_value": "NULL"を設定すると、NULL値は検索を処理できます.
    複数のフィールドを集約
    複数のフィールドを集約してインデックスに配置し、copy_を使用します.to重合を行う.たとえば、マルチフィールドクエリでは、各フィールドをフィルタリングする必要はなく、集約フィールドのみを使用できます.copy_を使用toの場合、集約の名前を指定することによって実現されます.
    実際、copy_to配列フォーマットを使用して名前を追加しないと、自動的にデータフォーマットに変換されます.
    2つのデータを追加し、検索を検証します.
    #   person      
    PUT person/_doc/1
    {
      "uId": 1,
      "name": "ytao",
      "age": 18,
      "address": "      ",
      "birthday": "2020-01-15T12:00:00Z",
      "money": 108.2,
      "isStrong": true
    }
    
    PUT person/_doc/2
    {
      "uId": 2,
      "name": "   ",
      "age": 22,
      "address": null,
      "birthday": "2020-01-15T12:00:00Z",
      "money": 68.7,
      "isStrong": true
    }
    full_nameの値をクエリーすると、nameとaddressに関連する値のオブジェクトが返されます.
    上から結果を返すと、ソースのフィールドに対応するcopyが追加されていません.toフィールド名なのでcopy_toはフィールドの内容をインデックスにコピーするだけで、含まれるフィールドは変更されません.
    まとめ
    この文書では、Mappingファイルを作成するための一般的で実用的な操作の紹介を通じて、これらの日常的な使用も基本的に把握できます.Mappingの機能操作を理解することは、ストレージ時の設計にも役立つと信じています.
    個人ブログ:https://ytao.top公衆番号【ytao】に注目し、より多くのオリジナルの良い文