大文字と小文字を区別しないフィルター処理、ファセット、並べ替えのためのテキスト正規化

重要

この機能はパブリック プレビュー段階にあり、追加使用条件の下で提供されます。 この機能は、プレビュー REST API でサポートされます。

Azure AI Search では、 ノーマライザー は、"フィルター可能"、"ファセット可能"、または "並べ替え可能" としてマークされたフィールドに対するキーワード 照合のテキストを事前に処理するコンポーネントです。 テキスト アナライザーと対になっているフルテキスト "検索可能" フィールドとは対照的に、フィルター-ファセット-並べ替え操作用に作成されたコンテンツでは分析もトークン化も行われません。 テキスト分析を省略すると、大文字と小文字や文字の違いが生じたときに予期しない結果が生じる可能性があります。そのため、コンテンツ内のバリエーションを均一化するために正規化が必要になります。

ノーマライザーを適用することで、結果を改善する簡易テキスト変換を実現できます。

  • 一貫性のある大文字小文字の区別 (すべて小文字や大文字など)
  • Ö や ê のようなアクセントおよび分音記号を、ASCII 文字である "o" や "e" に正規化する
  • - や空白をユーザーが指定した文字にマップする

ノーマライザーの利点

検索インデックスからドキュメントを検索して取得するには、クエリ入力をドキュメントの内容と一致させる必要があります。 照合は、"search" を呼び出す場合と同様に、トークン化されたコンテンツに対して行うか、要求が filterfacet、または orderby 操作の場合はトークン化されていないコンテンツに対して行われます。

トークン化されていないコンテンツも分析されないため、コンテンツ内の小さな違いは明らかに異なる値として評価されます。 次に例を示します。

  • $filter=City eq 'Las Vegas' は、"Las Vegas" と完全に一致するテキストを含むドキュメントのみを返し、"LAS VEGAS""las vegas" を含むドキュメントを除外するため、大文字と小文字の区別に関係なくすべてのドキュメントが必要なユースケースでは不十分です。

  • search=*&facet=City,count:5 は、"Las Vegas""LAS VEGAS""las vegas" を同じ都市であるにもかかわらず異なる値として返します。

  • search=usa&$orderby=City は、大文字と小文字の区別なく、同じ都市をまとめて並べたい場合でも、"Las Vegas""Seattle""las vegas" という辞書式順序で都市を返します。

インデックス作成とクエリの実行中に呼び出されるノーマライザーは、フィルター、ファセット、並べ替えのシナリオでテキストのわずかな違いをなくす簡易変換を追加します。 上記の例では、"Las Vegas" のバリアントは、より一様な結果を得るために、選択したノーマライザー (たとえば、すべてのテキストが小文字) に応じて処理されます (たとえば、すべてのテキストが小文字)。

ノーマライザーを指定する方法

ノーマライザーは、"filterable"、"sortable"、または "facetable" プロパティの少なくとも 1 つが true に設定されているテキスト フィールド (Edm.String および Collection(Edm.String)) のインデックス定義で、フィールドごとに指定します。 ノーマライザーの設定は省略可能であり、既定では null 値です。 カスタムのものを構成する前に、定義済みのノーマライザーを評価することをお勧めします。

ノーマライザーは、新しいフィールドをインデックスに追加するときのみ指定できます。したがって、可能な場合は、正規化のニーズを前もって評価し、インデックスの削除と再作成が恒常的に行われる場合は、開発の初期段階でノーマライザーを割り当ててみてください。

  1. インデックスでフィールド定義を作成するときに、"normalizer" プロパティを、"lowercase" などの定義済みノーマライザーまたはカスタム ノーマライザー (同じインデックス スキーマで定義されているもの) のいずれかの値に設定します。

    "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "filterable": true,
       "analyzer": "en.microsoft",
       "normalizer": "lowercase"
       ...
     }
    ]
    
  2. カスタム ノーマライザーは、インデックスの "normalizers" セクションで最初に定義した後、前のステップで示したようにフィールド定義に割り当てます。 詳細については、インデックスの作成に関する記事、および「カスタム ノーマライザーを追加する」を参照してください。

    "fields": [
     {
       "name": "Description",
       "type": "Edm.String",
       "retrievable": true,
       "searchable": true,
       "analyzer": null,
       "normalizer": "my_custom_normalizer"
     },
    

Note

既存のフィールドのノーマライザーを変更するには、完全にインデックスを再作成する必要があります (個々のフィールドを再作成することはできません)。

インデックス再作成の負担が大きい実稼働インデックスで推奨される回避策としては、古いフィールドに指定されていたものと同じノーマライザーを指定して新たにフィールドを作成し、これを古いフィールドの代わりに使用する方法があります。 新しいフィールドを組み込むには Update Index を使用し、それを事前設定するには mergeOrUpload を使用してください。 後で、計画的なインデックス サービスの一環として、インデックスをクリーンアップし、不要になったフィールドを削除することができます。

定義済みおよびカスタム ノーマライザー

Azure AI Search には、一般的なユース ケース用の組み込みのノーマライザーと、必要に応じてカスタマイズする機能が用意されています。

カテゴリ 説明
定義済みノーマライザー すぐに使用できる状態で提供されるため、構成が不要です。
カスタム ノーマライザー 1 高度なシナリオ向けです。 文字フィルターとトークン フィルターで構成される既存要素の組み合わせをユーザーが定義する必要があります。

(1) カスタム ノーマライザーは常に 1 つのトークンを生成するため、トークナイザーの指定は不要です。

ノーマライザーのリファレンス

定義済みノーマライザー

名前 説明とオプション
standard 後に asciifolding が続くテキストを小文字に変換します。
lowercase 文字を小文字に変換します。
大文字 文字を大文字に変換します。
asciifolding 基本ラテン Unicode ブロックに含まれていない文字が存在する場合は、それに対応する ASCII 値に変換します。 たとえば、àa に変更されます。
elision トークンの先頭から省略を削除します。

サポートされている文字フィルター

ノーマライザーでは、カスタム アナライザーの文字フィルターの対応するものと等しい 2 つの文字フィルターがサポートされています。

サポートされているトークン フィルター

次の一覧は、ノーマライザーでサポートされているトークン フィルターです。これは、カスタム アナライザーで使用されるトークン フィルター全体のサブセットです。

カスタム ノーマライザーを追加する

カスタム ノーマライザーは、インデックス スキーマ内で定義します。 定義には、名前、型、1 つ以上の文字フィルターとトークン フィルターが含まれます。 文字フィルターとトークン フィルターは、カスタム ノーマライザーの構成要素であり、テキストの処理を担います。 これらのフィルターは左から右に適用されます。

token_filter_name_1 はトークン フィルターの名前、char_filter_name_1char_filter_name_2 は文字フィルターの名前です (有効な値については、後の「サポートされているトークン フィルター」および「サポートされている文字フィルター」の表をご覧ください)。

"normalizers":(optional)[
   {
      "name":"name of normalizer",
      "@odata.type":"#Microsoft.Azure.Search.CustomNormalizer",
      "charFilters":[
         "char_filter_name_1",
         "char_filter_name_2"
      ],
      "tokenFilters":[
         "token_filter_name_1"
      ]
   }
],
"charFilters":(optional)[
   {
      "name":"char_filter_name_1",
      "@odata.type":"#char_filter_type",
      "option1": "value1",
      "option2": "value2",
      ...
   }
],
"tokenFilters":(optional)[
   {
      "name":"token_filter_name_1",
      "@odata.type":"#token_filter_type",
      "option1": "value1",
      "option2": "value2",
      ...
   }
]

カスタム ノーマライザーは、インデックスの作成中に追加することも、既存のインデックスを更新することによって後から追加することもできます。 既存のインデックスにカスタム ノーマライザーを追加するには、インデックスを更新するときに "allowIndexDowntime" フラグを指定する必要があります。これにより、数秒間インデックスが使用できなくなります。

カスタム ノーマライザーの例

次の例は、対応する文字フィルターとトークン フィルターを使用したカスタム ノーマライザーの定義を示しています。 文字フィルターとトークン フィルターのカスタム オプションは、名前付きコンストラクトとして個別に指定され、以下で説明するようにノーマライザーの定義で参照されます。

  • "my_custom_normalizer" という名前のカスタム ノーマライザーは、インデックス定義の "normalizers" セクションで定義されています。

  • ノーマライザーは、2 つの文字フィルターと、3 つのトークン フィルター (elision、lowercase、カスタマイズされた asciifolding フィルター "my_asciifolding") で構成されています。

  • 1 つ目の文字フィルター "map_dash" はすべてのダッシュをアンダースコアで置き換え、2 つ目 "remove_whitespace" はすべての空白を削除します。

  {
     "name":"myindex",
     "fields":[
        {
           "name":"id",
           "type":"Edm.String",
           "key":true,
           "searchable":false,
        },
        {
           "name":"city",
           "type":"Edm.String",
           "filterable": true,
           "facetable": true,
           "normalizer": "my_custom_normalizer"
        }
     ],
     "normalizers":[
        {
           "name":"my_custom_normalizer",
           "@odata.type":"#Microsoft.Azure.Search.CustomNormalizer",
           "charFilters":[
              "map_dash",
              "remove_whitespace"
           ],
           "tokenFilters":[              
              "my_asciifolding",
              "elision",
              "lowercase",
           ]
        }
     ],
     "charFilters":[
        {
           "name":"map_dash",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["-=>_"]
        },
        {
           "name":"remove_whitespace",
           "@odata.type":"#Microsoft.Azure.Search.MappingCharFilter",
           "mappings":["\\u0020=>"]
        }
     ],
     "tokenFilters":[
        {
           "name":"my_asciifolding",
           "@odata.type":"#Microsoft.Azure.Search.AsciiFoldingTokenFilter",
           "preserveOriginal":true
        }
     ]
  }

関連項目