Share via


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

重要

この機能はパブリック プレビュー段階にあり、追加使用条件の下で提供されます。 この機能は、プレビュー 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
        }
     ]
  }

関連項目