【60～90分】Azure Cognitive SearchでSharepoint内のファイル・画像（OCR / 画像解析検索）をAI検索する


# はじめに
シェアポイントやファイルサーバを探索して
情報を持たない画像をAI解析して検索したり、画像内の文字をOCR解析して検索したりしたいと思います。

実用性はもちろんですがエンジニアとして、とてもロマンが強いです。

今回はシェアポイント上で一部のフォルダ内を
Azure Cognitive Searchで検索してみたいと思います。

成果物のイメージとしては以下になります。
シェアポイント内の文字情報を含まないファイルに含まれる画像・画像ファイルをキーワード検索したり
画像内の文字情報をキーワード検索したりするAzure Cognitive Searchアプリケーションを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/173a156c-62eb-1236-a4e5-b5446b86a53e.png)

※PDFやExcelやWORD内に含まれる画像や文字情報もインデクス化して検索することが可能ですが今回は画像を検索していきます。
※シェアポイント内の検索範囲はかなり限定して行います



　
　
**作成のイメージは以下の通りです**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/1c267912-0cfa-aae0-631e-b929626e00ab.png)

　
　

# 事前準備

##ストレージアカウントの作成
### マーケットプレースでストレージアカウントを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/692a65cd-e1e4-a5a3-a91d-9ac6b5e596bf.png)

　

### Blob Storageを選択し、デプロイが完了したら、ブロブコンテナを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/52360be3-19a9-4914-32a1-3d0ca7978bed.png)


##Azure Cognitive Searchの作成
### マーケットプレースでAzure Cognitive Searchを作成します。
自分的にはAzureサービスの中で一番ロマンを感じるサービスです。Azure Cognitive Search大好きです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/26af2dad-a36a-be33-45c6-333a942940b7.png)

　
　
###検証の為、フリープランでAzure Cognitive Searchを作成します。
※設定の一例を記載しています。　　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/a16d463d-193a-bd24-111f-bd030e518470.png)


# 各サービスの連携

## Power Automate(シェアポイント→Azure Blob)の設定
### シェアポイントからAzure Blob Storage（ストレージアカウント）に接続するフローを作成する
シェアポイントの右上の自動化→Power Automate→フローの作成で同期するためのフローを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/ec1c31fc-006e-c67b-4453-8d7f8a65bf28.png)
　

### Power Automateのテンプレートを設定します
テンプレート→検索窓に『AzureBlob』を入力→『SharePointフォルダーからAzureBlobにフォルダーにファイルをコピーする』のテンプレートを選択
※もっと細かい同期の設定を行うテンプレートもありますが、記事にすると複雑になるので今回はシンプルなこちらを選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/0a6697f5-0a23-6877-24ce-59a633da1cf2.png)

　

###Azure Blob Storageのアカウント名・アクセスキーをPower Automateに設定していきます
#### 連携の設定を行います

シェアポイントとストレージの接続情報を入力します
　↓
同期元のシェアポイントの連携フォルダを選びます
※今回は検証を目的としているため連携フォルダはかなり限定的にしています。　これにより設定したフォルダ外は連携しません。
　↓
同期先のストレージコンテナを設定します
　↓
設定が完了したら保存します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/9e1c0fcf-0c46-15ff-46e4-72002b234671.png)


　


### 連携のテストをしてみます
####探索対象のフォルダにファイルを追加してみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/866f9917-a8a4-7dbc-e926-b48c5c967d77.png)


　

####マイフローからフローの実行履歴を確認してみます
前ステップでシェアポイントに追加したファイルをAzure Blobに同期した結果が確認できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/ab81d7a3-4d85-0f12-3bf6-98d296c44a12.png)

　

#### Azure Blobのコンテナにファイルが同期されているのを確認します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/53e5af12-3802-6e9b-9b78-f1b360154c54.png)



##Azure Search(Azure Storage→Azure Search)の設定
### Azure Storageの情報をAzure Searchに連携します。　
※Azure Storageのメニューから行うと設定がかなり楽です

####AzureストレージのメニューからAzure Searchの追加を選択して、対象のAzure Searchを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/bf64de1d-6ca4-df83-194f-5b18cd752401.png)

　
　

#### データソース名、コンテナ名を設定し、コグニティブスキルの追加ボタンを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/3d9dd2a6-31ee-18ea-ded1-5b7b786c63e1.png)


　

#### スキルセットを設定します　画像の認知技術とOCRにチェックを入れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/e4fcc220-4f76-5d3e-33cb-cebd2a362c40.png)

　

#### インデクスを設定します
取得可能フィールド、検索可能フィールドにチェックを入れ、アナライザを日本語Microsoftに変更します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/3f184f68-2cef-a444-3f23-36ff59fcdc0f.png)


　

#### インデクサを設定します
5分毎に自動実行されるようにカスタムの5分に設定します　
この設定により5分おきにシェアポイント内のファイルの情報をAzure Cognitive Searchにインデクスすることが可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/7b729410-691c-03f6-dcc1-fb8698299b28.png)

　
　
### Azure Cognitive Searchのスキルセットを修正します
#### Azure Cognitive Searchのポータルメニューからスキルセットを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/bcbb59bd-c1de-c74b-ff34-bc9faded3e13.png)



　

#### スキルセットjsonのocrスキルとイメージアナリティクススキルの言語をjaに変更します
以下はOCRスキルの設定例ですが、同じようにイメージアナリティクスの言語をjaに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/48802f05-9a55-ea4c-7c77-38cc299d4876.png)
　

変更が完了したら最後に保存を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/96307e0d-8073-a9ee-f3d9-21ec8d3306f2.png)


　

#### インデクサを再実行します
Azure Cognitive Searchポータルからインデクサー→インデクサ名を選択します、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/ce3002c1-015f-4446-1601-e248a1ff17d7.png)


　
インデクサをリセット→実行します
※初回構築時に１度実行しているため、リセットせずに実行を押すと、すでにインデクス済みのファイルはインデクスされないため、一度リセットします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/27b3fab4-3bfb-c7ae-5c51-5394fc1b7f37.png)



### 検索とOCR/画像解析の動作確認

#### Azure Cognitive Searchのメニューからインデクスを選択し、作成したインデクス名を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/9fa4328b-f74d-8d18-5d03-8983759bdcc4.png)

　

#### 試しに検索ボタンを押してみると、写真内の文字データを読み取れていることが確認できます
シェアポイントに入れた写真
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/234d1589-56b6-9893-a877-1bff54af70a4.png)
↓　↓　↓　↓　↓　↓　↓　↓　↓
インデクスの内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/6609cbfe-60b0-1bc1-045b-12278479ef27.png)

OCR解析により画像内の文字情報がINDEX化ことがわかります。
　


#### 文字データを持たない写真データ内を洞察してインデクスできていることが確認できます　
シェアポイントに入れた写真
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/cfeab936-44ba-e05b-1fb7-a58918a2ddd3.png)

↓　↓　↓　↓　↓　↓　↓　↓　↓
インデクスの内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/e62de1c5-352f-8317-cec4-c0c9b1411441.png)

画像解析により画像内の解析情報がINDEX化ことがわかります。

　　
　
# 検索用の画面を作成

## Azure Cognitive Searchの機能で検索画面をライトに作成する

なんとAzure Cognitive Searchには嘘のようで本当な魔法の画面作成機能があります。

　
### インデクスの操作画面から、そのままデモアプリの作成ボタンを押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/04c18005-510f-3ca6-77da-de85703251a7.png)


　


#### 候補を選択し、候補をmarged_content、metadata_storage_name、imageTagsを設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/cfb9adc3-e9a1-2434-a5db-40b3c49f52eb.png)
　
　
#### 個々の結果を選択し、metadata_storage_nameを縮小版とタイトルに、説明にmarged_contentに設定して、デモアプリの作成を押します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/7ead7442-a45a-d93e-bab6-7ef2ac319b24.png)

　
　
#### ダウンロードを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/7448119b-bb72-e264-5660-551bd2b0a475.png)


 
 
　
　

## 検索画面を操作して、シェアポイント内の画像ファイルを検索してみる
### アプリを立ち上げて検索してみます。　ひとまず無条件で検索してみると、シェアポイント内のファイルを検索できていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/1bd43415-ed88-2352-8b1d-9104a866cca6.png)


　

### 文字情報を全く含まない画像を検索してみます。　『ガーデン』というキーワードで検索してみます
文字情報を全く含まない情報でも検索可能なことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524081/e9bdcc43-8919-fa8d-ffaf-dea2162fff9a.png)


### 要カスタマイズ
ここまで標準の機能で作成することができました。　
以下の機能を別途構築・カスタマイズしたり他のAzureサービスとの連携で拡張したいと思います。
・CORにより読み取った情報を補正する
・今回は標準学習モデルを使用して画像解析していますが、カスタム学習モデルで特定の画像情報をインデクスする
・ファイルサーバ内の情報を検索する
・リッチな検索アプリを作成する