elasticsearch でのマッピングの完全なソリューション

マッピングの概要

マッピングは、ドキュメントとそのフィールドの保存方法とインデックス付け方法を定義する手段です。たとえば、mapping 次のコンテンツを定義します。

  • 全文検索タイプとして定義する必要があるフィールド
  • どのフィールドにnumberdateタイプなどが含まれるか。
  • 時刻形式をフォーマットする
  • 動的に追加されたフィールドのマッピングを制御するカスタム ルール

マッピングタイプ

各インデックスには、ドキュメントのインデックス付け方法を決定する一意のインデックスがあります mapping typemapping type以下の 2 つの部分で構成されます

  • メタフィールドは、
    ドキュメントに関連付けられたメタデータの処理方法をカスタマイズするために使用されます。メタ フィールドの例には、ドキュメントの _index、_type、_id、および _source フィールドが含まれます。

  • フィールドまたはプロパティの
    マッピング タイプには、ドキュメントに関連するフィールドまたはプロパティのリストが含まれます。

トークナイザーのベスト プラクティス

keyword後続の単語のセグメンテーションとtextデザインの単語のセグメンテーションの問題のため、ここでは単語のセグメンテーションのベスト プラクティスを示します。つまり、インデックス作成時に ik_max_word を使用し、検索時にトークナイザーとして ik_smart を使用することで、インデックス作成時にコンテンツを最大限にセグメント化し、検索時に目的の結果をより正確に検索できます。

たとえば、検索したいのは Xiaomi 携帯電話です。現時点での私の考えは、Xiaomi ステレオや Xiaomi 洗濯機などの他の製品ではなく、Xiaomi 携帯電話の製品を検索することです。製品情報にはHuawei携帯電話という単語のみが含まれています。

"search_analyzer": "ik_smart"この要件を達成するために後でこれを使用します。

フィールドタイプ

  • textkeyworddoublebooleanlongdate、タイプなどの単純なデータ型ip
  • 階層的な json オブジェクトにすることもできます (属性のネストをサポート)。
  • geo_point、、、など、一般的には使用されない特殊なタイプの場合もありますgeo_shapecompletion

同じフィールドに対して複数のフィールド タイプをサポートすると、検索ニーズをより適切に満たすことができます。たとえば、stringフィールドのタイプを全文検索をサポートするように設定できますtext。同時に、このフィールドにはkeyword並べ替えと集計のためのタイプも含めることができます。さらに、単語分割方法をフィールドごとに個別に設定することもできます。たとえば、"analyzer": "ik_max_word",

テキストタイプ

texttype フィールドは、電子メールの件名、淘宝京東の商品の説明などの全文検索に使用されます。この種のフィールドは、インデックス付けされて保存される前に単語で分割され、フィールド全体ではなく単語で分割された結果が保存されます。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時間形式をフィールドごとに形式設定できます。

jsones には時間型がないため、es では次の形式になります。

  • "2015-01-01"またはなどの書式設定された文字列"2015/01/01 12:10:30"
  • long特定の時間からのミリ秒数を示す数値型。例:1420070400001

  • integer特定の時刻からの秒数を参照する数値

オブジェクトタイプ

mappingobjectこれがデフォルトのタイプであるため、フィールドをタイプとして指定する必要はありません。

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 つの属性値が一致しなくなったことがわかり、ユーザーalicewhiteの関係がわかります。

レンジタイプ

次の範囲タイプがサポートされています。

タイプ 範囲
整数範囲 -2的31次 に 2的31次-1
float_range 32ビット単精度浮動小数点数
長距離 -2的63次 に 2的63次-1
double_range 64ビット倍精度浮動小数点数
日付範囲 符号なし64ビット整数ミリ秒
ip_range ipv4 と ipv6、または両方の混合
 

実戦:キーワードとテキストタイプを同時に使用

注: term はクエリ時にキーワードの単語分割がないことを意味し、keyword はインデックス作成時に単語分割がないことを意味します

上で説明したようにkeywordtext非単語分割インデックスとポスト単語分割インデックスがあり、それらのfields属性を使用して、現在のフィールドに havekeywordtexttype を同時に作成します。

まずインデックスを作成し、セット属性mappingの両方を指定します。titlekeywordtext

 

以下のデータを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 のデータと完全に一致し、最初のデータのみを検索する検索に切り替えます。検索苏泊尔キーワードを などに変更すると煮饭データは見つかりません。

titleuse のクエリを継続し、es 内のインデックス付きデータにキーワードがmatch含まれているため、最初と 3 番目のデータを見つけました。苏泊尔

検索すると、インデックスにそのような項目が存在せ苏泊尔煮饭SL3200ず、検索キーワードが単語分割されていないため、データが返されず、データが一致しません。しかし、コンテンツを変更すると、最初と 3 番目の項目を検索できます。これは、最初と 3 番目の項目の単語分割インデックスにフィールドが含まれているため、最初と 3 番目の項目を見つけることができます。title苏泊尔煮饭SL3200term苏泊尔title苏泊尔

実際の戦闘: 時間をフォーマットし、時間で並べ替える

インデックスを作成しidx_promytimestampフィールドとcreateTimeフィールドを 2 つの時刻形式にフォーマットします。

 

4 セットのサンプル データを挿入します

パラメーターを使用して並べ替えることができ、配列形式をサポートできますsort。つまり、複数フィールドの並べ替えを同時に使用できます。これを次のように変更するだけです[]

パラメーターを使用して、指定された時間範囲内のデータを検索することもできますrange。もちろん、次のようなタイプrangeサポートします。integerlong

おすすめ

転載: blog.csdn.net/qq_38140936/article/details/103541810