しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Search のプレビュー API に追加された ja.microsoft アナライザーとは何者なのか

先日公開された Azure Search の 2015-02-28-Preview API には、More Like This の他にアナライザーの追加が行われています。基本的には Microsoft が開発して Office や Bing で使われているものらしいです。

  • 50 analyzers backed by proprietary Microsoft natural language processing technology used in Office and Bing.
Azure Search Service REST API Version 2015-02-28-Preview

日本語のアナライザーも Lucene と Microsoft の 2 種類が用意されるようになりました。

  • ja.lucene
    • Uses morphological analysis
    • Normalizes common katakana spelling variations
    • Light stopwords/stoptags removal
    • Character width-normalization
    • Lemmatization - reduces inflected adjectives and verbs to their base form
  • ja.microsoft
    • Uses morphological analysis

とりあえず試してみようと思ったので、まずは RedDot.Search を前回と同様に改造しました。一応、対応したバージョンはブランチ切って GitHub にプッシュしてあります。

このフォークした RedDog.Search を使えば、以下のようなコードで新しいアナライザーを指定できます。

var connection = ApiConnection.Create("SEARCH_NAME", "ADMIN_KEY");

var client = new IndexManagementClient(connection);

await client.CreateIndexAsync(new Index("entries")
    .WithStringField("id", x => x.IsKey().IsRetrievable())
    .WithStringField("title", x => x.IsSearchable().IsRetrievable().Analyzer("ja.microsoft"))
    .WithStringField("body", x => x.IsSearchable().IsRetrievable().Analyzer("ja.microsoft")));

プレビューポータルで確認すると、以下のように表示されます。でも設定が出来ないのは残念ですね。

f:id:shiba-yan:20150307135924p:plain

インデックスへのドキュメントの追加は、前回と同様にこのブログの記事を全て投入しました。検索キーワードは何時ものアレを使って、まずは ja.lucene の方から試します。

f:id:shiba-yan:20150307140553p:plain

ハイライトを有効にすると、ある程度はどのように形態素解析されたか確認出来ます。

f:id:shiba-yan:20150307140212p:plain

キーワード的にはいい感じに認識されている感じです。

次は ja.microsoft を指定したインデックスで検索してみます。

f:id:shiba-yan:20150307140748p:plain

いい感じに見えますが、最後に全く関係なさそうな記事が混ざってきています。ハイライトの結果は以下の通りになりました。

f:id:shiba-yan:20150307140235p:plain

Lucene に比べると、やたら細かくハイライトされてます。細切れにしすぎた結果、関係ない記事が検索結果に混ざってきたと考えるのが妥当な気がします。*1

ちなみに ja.lucene と ja.microsoft だと処理速度がかなり違ってきました。自分が試した範囲だと ja.microsoft が桁違いに遅かったので、基本的には ja.lucene 使っておけば良いと思います。

*1:検索結果が結構 Bing っぽい、悪い意味で