Azure AI SearchでCosmos DBの内容を検索する際にUnicode正規化を行う(カタカナ英数字の全角/半角統一など)
Cosmos DB からインデクサーでドキュメントを取得する際に正規化することができる。
Cosmos DB 側で、コンテナに以下のユーザー定義関数 (UDF) を作成
code:js
function nfkcNormalize(str) {
return String(str).normalize("NFKC");
}
JavaScript には Unicode の正規化を行う関数があり、 Cosmos DB のユーザー定義関数は JavaScript で実装する
使うっきゃない
ただし RU がかなり増える (=インデックスの作成が遅くなる)
NFKC 正規化では、「半角カタカナ→全角カタカナ」「全角英数字→半角英数字」などの変換や、濁点/半濁点などの合成 (コードポイント2つで表現されていたものを1つにまとめる) が行われる Azure AI Search 側のデータソース設定で、取得時にユーザー定義関数を使うよう設定する
id, text 項目を取得するクエリの例
code:sql
SELECT c.id, udf.nfkcNormalize(c.text) normalizedText, c._rid, c._ts from c WHERE c._ts > @HighWaterMark order by c._ts
https://gyazo.com/a1f17ed21776ebefb5ea1aa69d827dd0
検索時も同様に String(str).normalize("NFKC") などで検索文字列等を正規化してから検索を行う
カタカナ英数字の全角半角統一さえできればよい場合の別解: カスタムアナライザーを使う
利点: 検索文字列に対して正規化を加える必要が無い (多分)
欠点: アナライザーの実装によっては、NFDとNFCが別文字列として扱われるかも 欠点: NFKC などの Unicode 正規化は、 2024年10月時点で AI Search に組み込まれていない cjk_width は NFKC/NFKD でも同じことが行われているが、 NFKC/NFKD 自体は実装されてない