マッピングの概要
マッピングは、ドキュメントとそのフィールドの保存方法とインデックス付け方法を定義する手段です。たとえば、mapping
次のコンテンツを定義します。
- 全文検索タイプとして定義する必要があるフィールド
- どのフィールドに
number
、date
タイプなどが含まれるか。 - 時刻形式をフォーマットする
- 動的に追加されたフィールドのマッピングを制御するカスタム ルール
マッピングタイプ
各インデックスには、ドキュメントのインデックス付け方法を決定する一意のインデックスがあります mapping type
。mapping type
以下の 2 つの部分で構成されます
-
メタフィールドは、
ドキュメントに関連付けられたメタデータの処理方法をカスタマイズするために使用されます。メタ フィールドの例には、ドキュメントの _index、_type、_id、および _source フィールドが含まれます。 -
フィールドまたはプロパティの
マッピング タイプには、ドキュメントに関連するフィールドまたはプロパティのリストが含まれます。
トークナイザーのベスト プラクティス
keyword
後続の単語のセグメンテーションとtext
デザインの単語のセグメンテーションの問題のため、ここでは単語のセグメンテーションのベスト プラクティスを示します。つまり、インデックス作成時に ik_max_word を使用し、検索時にトークナイザーとして ik_smart を使用することで、インデックス作成時にコンテンツを最大限にセグメント化し、検索時に目的の結果をより正確に検索できます。
たとえば、検索したいのは Xiaomi 携帯電話です。現時点での私の考えは、Xiaomi ステレオや Xiaomi 洗濯機などの他の製品ではなく、Xiaomi 携帯電話の製品を検索することです。製品情報にはHuawei携帯電話という単語のみが含まれています。
"search_analyzer": "ik_smart"
この要件を達成するために後でこれを使用します。
フィールドタイプ
text
、keyword
、double
、boolean
、long
、date
、タイプなどの単純なデータ型ip
。- 階層的な json オブジェクトにすることもできます (属性のネストをサポート)。
geo_point
、、、など、一般的には使用されない特殊なタイプの場合もありますgeo_shape
。completion
同じフィールドに対して複数のフィールド タイプをサポートすると、検索ニーズをより適切に満たすことができます。たとえば、string
フィールドのタイプを全文検索をサポートするように設定できますtext
。同時に、このフィールドにはkeyword
並べ替えと集計のためのタイプも含めることができます。さらに、単語分割方法をフィールドごとに個別に設定することもできます。たとえば、"analyzer": "ik_max_word",
テキストタイプ
text
type フィールドは、電子メールの件名、淘宝京東の商品の説明などの全文検索に使用されます。この種のフィールドは、インデックス付けされて保存される前に単語で分割され、フィールド全体ではなく単語で分割された結果が保存されます。text
フィールドは並べ替えや集計には適していません。keyword
一部の構造化フィールドでは、電子メール アドレス、ホスト名、製品ラベルなど、単語分割後の意味のないフィールドにタイプを使用することをお勧めします。
共通パラメータには次のものがあります。
- アナライザー:インデックス ストレージ ステージと検索ステージ(クエリ ステージはsearch_analyzerパラメーターによってオーバーライドできる)を含む単語のセグメンテーションに使用されます。このパラメーターは、デフォルトでインデックスまたは標準アナライザーのアナライザー設定に設定されます。
- Index: 検索できるかどうか。デフォルトは
true
- フィールド: マルチフィールドを使用すると、同じ文字列値をさまざまな方法で同時にインデックス付けできます。たとえば、異なるアナライザーを使用して、並べ替えとクラスタリング用に 1 つのフィールドを作成し、分析と全文検索用に別の同じ文字列を作成します。以下、詳しい説明をしていきます
- search_analyzer: このフィールドは、検索フェーズで使用されるトークナイザーを指定するために使用されます (デフォルト
analyzer
設定) 。 - search_quote_analyzer: フレーズの検索時に使用されるトークナイザー、デフォルト
search_analyzer
設定
キーワードの種類
keyword
構造化コンテンツ (電子メール アドレス、ホスト名、ステータス コード、郵便番号、ラベルなど) のインデックス付けに使用されるフィールド。これらのフィールドは分割後は意味がなくなるため、単語分割の結果ではなく、完全なフィールドをes でインデックス付けする必要があります。
一般的に、フィルタリング (ブログでの公開ステータスに基づいて公開されたすべての記事のクエリなど)、並べ替え、集計に使用されます。keyword
記事 ID による記事の詳細のクエリなど、フィールドによる正確な検索のみが可能です。このフィールドに基づいて関連語の全文検索を実行する場合は、text
タイプを使用できます。
PUT my_index { "mappings": { "properties": { "tags": { "type": "keyword" } } } }
- Index: 検索できるかどうか。デフォルトは
true
-
フィールド: マルチフィールドを使用すると、同じ文字列値をさまざまな方法で同時にインデックス付けできます。たとえば、異なるアナライザーを使用して、並べ替えとクラスタリング用に 1 つのフィールドを作成し、分析と全文検索用に別の同じ文字列を作成します。以下、詳しい説明をしていきます
-
null_value: フィールドが空の場合は、デフォルト値を設定します。デフォルトは次のとおりです。
null
-
ignore_above: インデックス フィールド サイズのしきい値を設定します。このフィールドは、この属性で設定された値を超える値にはインデックスを付けません。デフォルト値は 2147483647 で、これは任意のサイズの値を受け取ることができることを意味します。
PUT Mapping Api
ただし、この値は、中央に設定された新しい値によって上書きできますignore_above
。
日付型
並べ替えがサポートされており、format
時間形式をフィールドごとに形式設定できます。
json
es には時間型がないため、es では次の形式になります。
"2015-01-01"
またはなどの書式設定された文字列"2015/01/01 12:10:30"
-
long
特定の時間からのミリ秒数を示す数値型。例:1420070400001
-
integer
特定の時刻からの秒数を参照する数値型
オブジェクトタイプ
mapping
object
これがデフォルトのタイプであるため、フィールドをタイプとして指定する必要はありません。
json
型は本質的に階層的であり、ドキュメントobject
にはネストする型を含めることもできます。例えば:
PUT my_index { "mappings": { "properties": { "region": { "type": "keyword" }, "manager": { "properties": { "age": { "type": "integer" }, "name": { "properties": { "first": { "type": "text" }, "last": { "type": "text" } } } } } } } }
ネストタイプ
nest
型は、配列にインデックスを付けることがobject
できる特別な型であり、配列内の各項目を個別に取得できます。object
nest
さらに、es には内部クラスの概念はありませんが、その効果は次の構造ドキュメントのような単純な list を通じて実現されます。
上記の形式のオブジェクトは、次の形式に従ってインデックス付けされるため、ユーザー内の 2 つの属性値が一致しなくなったことがわかり、ユーザーalice
とwhite
の関係がわかります。
レンジタイプ
次の範囲タイプがサポートされています。
タイプ | 範囲 |
---|---|
整数範囲 | -2的31次 に 2的31次-1 。 |
float_range | 32ビット単精度浮動小数点数 |
長距離 | -2的63次 に 2的63次-1 。 |
double_range | 64ビット倍精度浮動小数点数 |
日付範囲 | 符号なし64ビット整数ミリ秒 |
ip_range | ipv4 と ipv6、または両方の混合 |
実戦:キーワードとテキストタイプを同時に使用
注: term はクエリ時にキーワードの単語分割がないことを意味し、keyword はインデックス作成時に単語分割がないことを意味します
上で説明したようにkeyword
、text
非単語分割インデックスとポスト単語分割インデックスがあり、それらのfields
属性を使用して、現在のフィールドに havekeyword
とtext
type を同時に作成します。
まずインデックスを作成し、セットと属性mapping
の両方を指定します。title
keyword
text
以下のデータをesに挿入しました
_索引 | _タイプ | _id | _スコア | アイテムID | タイトル | 説明 | 番号 | 価格 |
---|---|---|---|---|---|---|---|---|
idx_item | _doc | rvsX-W4Bo-iJGWqbQ8dk | 1 | 1 | スーパー炊飯 SL3200 | 料理がもっと楽になり、生活がもっと楽しくなる | 100 | 200 |
idx_item | _doc | spSY-W4Bo-iJGWqbscfU | 1 | 3 | ミスターマイティ・ザ・キッチン | あなたはお粥を作り、私は鍋を洗います | 100 | 30 |
idx_item | _doc | r_sX-W4Bo-iJGWqbhMew | 1 | 2 | スーパーグッド お粥調理器 モデル SL322 | あなたがお粥を作り、私がお粥を作り、一緒にお粥を簡単に作りましょう | 100 | 190 |
title=”苏泊尔煮饭SL3200“
text
最も詳細な単語分割設定 に従って"analyzer": "ik_max_word"
、インデックスの保存は es で次の形式で実行されます。
title.keyword=”苏泊尔煮饭SL3200
単語の分割がないため、es のインデックスの格納形式は次のようになります。
まずtitle.keyword
最初のデータを検索します。match
検索ではキーワードを単語に分割してから検索します。単語分割後の結果には が含まれているため、検索は成功します。"苏泊尔煮饭SL3200"
検索キーワードを に変更するとデータは見つかりません苏泊尔
。など. 煮饭
.
term
単語を分割せず、es のデータと完全に一致し、最初のデータのみを検索する検索に切り替えます。検索苏泊尔
キーワードを などに変更すると煮饭
データは見つかりません。
title
use のクエリを継続し、es 内のインデックス付きデータにキーワードがmatch
含まれているため、最初と 3 番目のデータを見つけました。苏泊尔
検索すると、インデックスにそのような項目が存在せ苏泊尔煮饭SL3200
ず、検索キーワードが単語分割されていないため、データが返されず、データが一致しません。しかし、コンテンツを変更すると、最初と 3 番目の項目を検索できます。これは、最初と 3 番目の項目の単語分割インデックスにフィールドが含まれているため、最初と 3 番目の項目を見つけることができます。title
苏泊尔煮饭SL3200
term
苏泊尔
title
苏泊尔
実際の戦闘: 時間をフォーマットし、時間で並べ替える
インデックスを作成しidx_pro
、mytimestamp
フィールドとcreateTime
フィールドを 2 つの時刻形式にフォーマットします。
4 セットのサンプル データを挿入します
パラメーターを使用して並べ替えることができ、配列形式をサポートできますsort
。つまり、複数フィールドの並べ替えを同時に使用できます。これを次のように変更するだけです[]
。
パラメーターを使用して、指定された時間範囲内のデータを検索することもできますrange
。もちろん、次のようなタイプもrange
サポートします。integer
long