Azure Cognitive Searchで検索エンジンの基本操作を行う

# はじめに
こんにちは[rilmayer](https://twitter.com/rilmayer_jp)です。
この記事はアドベントカレンダー「[Search&Discovery 全部俺](https://adventar.org/calendars/4691)」16日目の記事となります。（ひどい遅れ

本日は全文検索エンジンのサービスである[Azure Cognitive Search](https://azure.microsoft.com/ja-jp/services/search/)の紹介をしたいと思います。
Azureは技術的になかなか好きなんですが、仕事などではAWSやGCPを使う機会が多くなかなか使う機会がないので、今回はちょっとお試しに使ってみました。

ちなみにこの記事は、[以前の記事](https://qiita.com/rilmayer/items/670e2a24fe16a00d1407)で紹介した全体像のうちの検索エンジンの一例です。

# Azure Cognitive Searchとは？
Microsoftが提供する検索エンジンのSaaSです。


# 検索エンジンとしての基本的な操作を試してみる
## Cognitive Search の作成
事前にAzureへの登録が必要です。
[こちら](https://docs.microsoft.com/ja-jp/azure/search/search-create-service-portal)のドキュメントにしたがって新しくサービスを作成します。


## Indexの作成・データの投入・検索
以前の記事と同様、サンプルとしてアイドル検索をやってみます。
今回も操作スクリプトをPythonで書いてみました。
[こちら](https://docs.microsoft.com/ja-jp/azure/search/search-get-started-python)にしたがってやっていきます。

### インデックス作成 wiht スキーマ定義
「アイドル名」と「アイドルの説明」の2つのフィールドを用意したスキーマを定義します。
以下の操作はGUIでもできる模様です。

日本語のアナライザーはMSのもの（ `ja.microsoft` ）とlucene（ `ja.lucene` ）の2つを選べるようです。
https://docs.microsoft.com/ja-jp/azure/search/index-add-language-analyzers
今回はせっかくなのでMSのものを使ってみました。

```
import json
import requests
from pprint import pprint

# 設定
endpoint = 'https://<YOUR-SEARCH-SERVICE-NAME>.search.windows.net/'
api_version = '?api-version=2019-05-06'
headers = {'Content-Type': 'application/json',
        'api-key': '<YOUR-ADMIN-API-KEY>' }


# インデックスの作成
index_schema = {
   "name": "idols",
   "fields": [
       {"name": "id", "type": "Edm.String", "key": "true", "filterable": "true"},
       {"name": "idol_name", "type": "Edm.String", "searchable": "true", "filterable": "false", "sortable": "false", "facetable": "false", "analyzer": "ja.microsoft"},
       {"name": "description", "type": "Edm.String", "searchable": "true", "filterable": "false", "sortable": "false", "facetable": "false", "analyzer": "ja.microsoft"}
   ]
}

url = endpoint + "indexes" + api_version
response  = requests.post(url, headers=headers, json=index_schema)
index = response.json()
pprint(index)

# インデックスの確認
url = endpoint + "indexes" + api_version + "&$select=name"
response  = requests.get(url, headers=headers)
index_list = response.json()
pprint(index_list)
```

### データの追加
例にもれずアイドルデータを追加します。

```python
# descriptionはwikipediaの該当ページから拝借
#   https://ja.wikipedia.org/wiki/AmiinA
#   https://ja.wikipedia.org/wiki/%E3%83%BB%E3%83%BB%E3%83%BB%E3%83%BB%E3%83%BB%E3%83%BB%E3%83%BB%E3%83%BB%E3%83%BB
#   https://ja.wikipedia.org/wiki/%E3%83%A4%E3%81%AA%E3%81%93%E3%81%A8%E3%81%9D%E3%81%A3%E3%81%A8%E3%83%9F%E3%83%A5%E3%83%BC%E3%83%88
#   https://ja.wikipedia.org/wiki/BEYOOOOONDS
#   https://ja.wikipedia.org/wiki/TipToe.
items = [
    {
        "idol_name": "amiinA",
        "description": '雑誌「ニコ☆プチ」の読者モデルであった[1]amiと、miinaの2人で「  あみいな」を結成。「あみいな」は2人の名前「あみ」と「みいな」を掛け合わせたもの。\n\n2012年8月、当時同じ事務所のMYM Melodyが出演するイベントで初披露。\n\n結成当初は、ももいろクローバーZやAKB48などのカバーだったが、オリジナル曲を作る際にプロデューサーとして楽曲クリエイティブチーム・nanolineの齊藤州一が加わる[2]。\n\n2013年8月、初のシングル「1☆2☆3☆/マインドトラベル」を発売。アーティスト表記をアルファベットの「amiina」とする。\n\n2014年4月に吉田豪が「With you」（bayfm）[3]で、5月に南波一海がインターネット放送「南波一海のアイドル三十六房」[4]で「マインドトラベル」を紹介したことから、その頃から音楽に詳しいアイドルファンから反応が来るようになり、齊藤は「音楽的に自由に攻めてもいいのではないか」と思うようになったと語っている[5]。\n\n2016年2月13日のLIVEをもってmiinaが脱退[6]、活動休止となる。\n\n2016年3月22日、スタッフのTwitterで、表記を「amiinA」に変更し、新メンバーを加え活動を再開することを発表[7]。 5月3日、渋谷WWWで開催された「WonderTraveller!!! act.4」で、新メンバーmiyuが加入し、amiinAとして再始動[8]。\n\n2016年12月28日のライブをもち、miyuの高校受験のため活動を一時休止[9]。\n\n2017年4月15日よりライブ活動を再開[10]。\n\n新生amiinAは、「awake mind into ideal naked Avalon」の略。\n'
    },
    {
        "idol_name": "・・・・・・・・・",
        "description": '2016年4月に開催された「『女の子の東京をつくろう!!』プロジェクト アイドルオーディション」で選ばれたメンバーによるユニット[1][2]。\n\nコンセプトは「ポスト・ポケモンGO!時代のアイドル」「常に纏える(まとえる)アイドル」[3]「都市の幽霊」[4]。\n\n名前や顔を出さない、シューゲイザーやアンダーグラウンド・パンクなどを踏襲した楽曲、テクノロジーを用いた全く新しいアイドル活動などを特徴とする。\n\nライブのことを「観測」、ファンのことを「観測員」と呼ぶ。\n\nライブ中は写真撮影可能、動画撮影不可[5]。\n'
    },
    {
        "idol_name": "ヤなことそっとミュート",
        "description": 'BELLRING少女ハート→There There Theresの運営を手掛けたクリムゾン印刷による新アイドルプロジェクト。ただし、BELLRING少女ハートディレクターの田中紘治およびAqbiRecは運営には関与せず[1]、エンジニアの慎秀範（DCG代表）と林惇太、作曲家・アレンジャーのタニヤマヒロアキ（2019年離脱[注 1]）からなるチーム「DCG ENTERTAINMENT」がプロデュースを担っている[2]。\n\nコンセプトは「ヤなことだらけの日常をそっとミュートしても何も解決しないんだけど、とりあえずロックサウンドに切ないメロディーを乗せて歌ってみる事にする。」[3]。グランジやシューゲイザーといったオルタナティブ・ロックを主体とする。なお、タニヤマはヤナミューではマネージメントとパフォーマンスを主に担当[2]していたため、本職である作曲・編曲はオープニングSEの「ヤなことFriday」以外手がけていない。\n\nライブ中の写真撮影・動画撮影は原則として可能。リフト、ダイブ、サーフといった"人の上に乗る行為"は2017年4月29日以降禁止。\n'
    },
    {   
        "idol_name": "BEYOOOOONDS",
        "description": 'ハロプロ研修生から選ばれたメンバーで結成されたユニット、CHICA#TETSU（チカ＃テツ）、雨ノ森 川海（あめのもり かわうみ）、および『ハロー!プロジェクト“ONLY YOU”オーディション』合格者により構成される[1]。\n「〜を超えて」「〜の向こう側へ」という意味の英単語「Beyond」をグループ名の語源とし、既成の枠組などを超えて、自由に未来へ大きくビヨーンと伸びていってほしいという思いが込められている。形を変幻自在にビヨーンびよーんと変貌させる、スライムのようなグループを目指す[1]。\nBEYOOOOONDSのリーダーは、2018年12月現在、公式には発表されていない。\n'
    },
    {   
        "idol_name": "tipToe.",
        "description": '制作プロダクション合同会社SOVAの社内プロジェクトとして立ち上がり、2016年夏に行ったオーディション[1] で一般から選ばれたメンバーで結成。「みんなで青春しませんか？」をコンセプトに掲げ、青春や学校をモチーフとした楽曲やヴィジュアルが持ち味。メンバーは3年任期制で加入から3年で必ず卒業することになっている。\n\n統括及び音楽プロデューサーは音楽レーベル6jomaProject主宰の本間翔太。映像や衣装などを担当するヴィジュアルプロデューサーは写真家の長谷川圭佑。楽曲や振付などに自身もアーティストとして活動する若手クリエイターを数多く起用することも特徴。\n\n楽曲は、渋谷系ギターポップをベースにエレクトロニカ・チップチューンの要素を盛り込んだ爽やかでエモーショナルなものが多い。\n\nグループ名は「少しだけ背伸びして、今よりも高い所に届くように」という思いを込めて「背伸びする」(=「つま先で立つ」)を意味する英語「stand on tiptoe」から[2]。\n'
    }
]

# 整形
upload_documents = {"value": []}
for i in range(len(items)):
    item = items[i]
    item['id'] = str(i)
    item["@search.action"] = "upload"
    upload_documents["value"].append(item)
```

### データの検索
以下のようなコマンドで検索ができます。
クエリの作り方はSolrと似てるかもしれません。
また日本語の場合エンコードが必要なところに注意です。

```python
# 検索
query = urllib.parse.quote("メンバー")
searchstring = f"&search={query}&$count=true&$select=id,idol_name,description"
url = endpoint + "indexes/idols/docs" + api_version + searchstring
response  = requests.get(url, headers=headers, json=searchstring)
results = response.json()

# 結果表示
print('hit:  ', results['@odata.count'])
for i, result in enumerate(results['value']):
    print(f"[{i}]",result['idol_name'], ':  ', result['description'][0:50])
```

結果は以下のような感じ。
ちなみに、自動でヒットした単語のハイライトとかも行なってくれて便利です。

```
hit:   4
[0] tipToe. :   制作プロダクション合同会社SOVAの社内プロジェクトとして立ち上がり、2016年夏に行ったオーディシ
[1] ・・・・・・・・・ :   2016年4月に開催された「『女の子の東京をつくろう!!』プロジェクト アイドルオーディション」で選
[2] BEYOOOOONDS :   ハロプロ研修生から選ばれたメンバーで結成されたユニット、CHICA#TETSU（チカ＃テツ）、雨ノ森
[3] amiinA :   雑誌「ニコ☆プチ」の読者モデルであった[1]amiと、miinaの2人で「  あみいな」を結成。「あ
```

# おわりに
今回はPaaSのAzure Cognitive Searchを検索サーバーとして使ってみるためのさわりを紹介してみました。
Algoriaは使い勝手が良かったですが、Cognitive Searchの方が日本語のサポートがしっかりしている印象でした。
前回と引き続きですが、こうした検索のPaaSは非常に協力なので個人で検索サービスなどを立ち上げる際は一つの選択肢としてとても有力だなと思いました。
よほどカスタマイズしたいとかがない限りこうしたサービスを使う方が初めは良いかなと思っています。