oneWEX検証メモ - (4)ApplicationBuilderによるWebアプリの作成と文書の検索

#はじめに
oneWEXを使ってみた時のメモです。

ここでは、oneWEXの"検索/探索"という機能に着目し、Application Builderを使って文書の検索がどのように行えるかをやってみたいと思います。

##関連記事

インストール関連
[oneWEX導入メモ / Ubuntu編](https://qiita.com/tomotagwork/items/bdd48adf45140b584678)
[oneWEX導入メモ / RHEL7.6 オフライン編](https://qiita.com/tomotagwork/items/6ad047d0b72e199b7878)

検索関連
[oneWEX検証メモ - (0) 概要理解](https://qiita.com/tomotagwork/items/2c00007f45a3d2e482ea)
[oneWEX検証メモ - (1)ファイルシステムクローラーによるデータの取り込み / データセット、コレクションの作成](https://qiita.com/tomotagwork/items/00301322d4336b52d1e3)
[oneWEX検証メモ - (2)Windowsファイルシステムクローラーによるデータの取り込み](https://qiita.com/tomotagwork/items/1619624af8a64cf330d4)
[oneWEX検証メモ - (3)ContentMinerによる文書の検索](https://qiita.com/tomotagwork/items/24b5bbcc85c6bada41da)
[oneWEX検証メモ - (4)ApplicationBuilderによるWebアプリの作成と文書の検索](https://qiita.com/tomotagwork/items/a53b2c7f52cb1dcb68d9)

分析関連
[oneWEX検証メモ - (5)ContentMinerによる分析 / ガイド付きモード](https://qiita.com/tomotagwork/items/a9c381a477594453e2b1)
[oneWEX検証メモ - (6)ContentMinerによる分析 / 各種"ID情報"をベースとした分析](https://qiita.com/tomotagwork/items/9269fd31109638e6dd89)

API関連
[oneWEX検証メモ - (7)REST API](https://qiita.com/tomotagwork/items/7c1340f41333896f8fe3)



# 全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b054e064-06e9-1b41-e787-2effe67401c0.png)


今回は、Windowsファイルシステムクローラーで取り込んだデータをベースに考えます(NFSマウントのケースでも同じですが。
ContentMinerのところでも記載しましたが、残念ながらoneWEX自体にはクロール対象のファイルをHTTP経由でアクセスさせる機能を提供してくれないようです(Webサーバー機能もあり、ファイルにアクセスすることもできているにも関わらず!!!)。
なので、わざわざHTTPでファイルにアクセスする仕組みを個別に構築する必要があります。
その上で、Webアプリを作る際に、検索結果のをカスタマイズして、その公開した仕組みに応じたURIに変換する、ということをやる必要があります。
※本当にもっとスマートな方法はないんだろうか???

# WebServerの設定
ここでは、Windows Server上にWebServer(IIS)を立てて、検索した文書にHTTP経由でブラウザからアクセスできるようにすることを想定します。
ここは本質的な所ではなく、やり方も色々あると思うので詳細は省略します。
とりあえず、IIS上で仮想ディレクトリとしてクロール対象のディレクトリを登録し、```http://<winserver_host>/oneWexTest03/...```というURIでファイルにアクセスできるようにしておきます。

# ApplicationBuilderによるアプリ開発

## ApplicationBuilder概要
参考: [アプリケーションの構築](https://www.ibm.com/support/knowledgecenter/ja/SS8NLW_12.0.0/com.ibm.watson.wex.ee.doc/c_onewex_appbuilder.html)
AppBuilderは、oneWEXの検索/分析機能を利用したWebアプリケーションの開発支援ツールです。ブラウザからGUIベースでWebアプリケーションを開発できるような機能が提供されています。

以下のURLでApplicationBuilderにアクセスします。
```https://<hostname>:443/builder/```

## データソース作成
まず、これから作成するWebアプリケーションで検索/分析対象とするデータ(コレクション)を登録します。ApplicatoinBuilder上は、取り扱うデータは**データソース**というリソースとして登録されます。
左上のメニューボタンを押してプルダウンメニューからデータ・ソースを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b9a27a52-0de6-cd6f-1a99-2aceefb9cd26.png)

データソースの作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4baa3073-0918-3f5d-cd59-4fdb7e18fa8e.png)

バックエンドとして Local oneWEX backend を選択し、検索/分析対象のコレクションを選択し、作成ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/da3f95d2-8d75-2805-87bc-60ebbeacc2e6.png)

データソースが登録されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f4a6e5f8-e5c4-f7a4-f53b-cf1721012d39.png)


1つのWebアプリケーションで複数のデータソースを扱うこともできるので、必要なだけここでデータソースを登録しておきます。

## プロジェクトの作成
左上のプルダウンメニューから作成を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1cc2431d-db4e-9770-7063-e96fb1a37f4e.png)

プロジェクトの作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e8a4f08f-b62b-018d-3d8b-fc4f5c785ff3.png)

名前、パスを指定してOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c19b60db-bcdc-898b-fc10-9e6526617b9d.png)

先ほど作成したデータソースがリストされるので、必要なデータソースを選択して次へ。
(複数のデータソースを登録しておけば、複数データソースを選択することもできます。ここでは1つのみ選択。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8cb5e4ef-fe3a-55db-b166-4292234dfc40.png)

全体のレイアウトをカスタマイズします。ここではデフォルトのままにして、次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/60b6c9cb-78c0-34ac-e236-0772d413119f.png)

ページタイトルを設定して、先ほどの全体レイアウトの中の真ん中部分にあるページ・コンテンツ域部分のレイアウトを選択します。ここでは3列
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/66bdc413-4534-7228-d41f-e323a09e3bd0.png)

ページのカスタマイズ画面になるので、ここで、上にあるウィジェットをしたのレイアウト域にドラッグ&ドロップで配置していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/46540550-0b0a-430d-162a-47827f327d13.png)

例えばこんな感じにウィジェットを配置してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3b5540cd-f4a1-232b-5c9b-bbd155f06b74.png)

左側の枠の絞り込みのウィジェットで"ファセットの選択"をクリックし、ファセットのプルダウンメニューからDirectory_Nameを選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b447cefa-4d08-d2a2-5c73-0abf1a94bf1d.png)

右側の枠のグラフのウィジェットで"ファセットの選択"をクリックし、ファセットのプルダウンメニューからLast_Modified_Dateを選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/dc3731fd-e407-292a-5f63-5ba34024d8ee.png)

結果、こんな感じになります。とりあえずカスタマイズはここまでにして、次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a6977c52-ac92-0bd5-bf59-585a6f4897b6.png)

プレビュー画面が表示されるので、ここで実際に動かしてみることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7721eed3-9241-e0a3-5ae4-a4daed389e53.png)

検索窓に「トランザクション」と入れて検索してみると、こんな感じで結果が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a6b596ca-b15e-3997-ff99-8bc815d465a8.png)


結果リストのURIは、クローラーごとにスキーム名が違っているようで、Windowsファイルシステムクローラーの場合は```winfs://```というスキーム名が付きます。また、ContentMainerでみた時のように日本語がエンコードされた状態になっています。
右側の枠のLast_Modified_Dateは、データが少なくて最終更新日のばらつきもないので変なグラフになってますが、これは棒グラフで最終更新日の時期ごとに棒グラフになって件数が表示されています。

まずは一旦基本的な形はできたので保存します。

"アプリとして表示"をクリックすると、正式なアプリとして実行することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/59f085ca-be36-d440-34ce-fe5c60f49b96.png)

このURLを公開すれば、各ユーザーがこのアプリケーションを直接利用できるということになります。

## ファイルアクセス用のカスタマイズ

さて、結果のリストのURIが```winfs://```という謎のスキーム名になっているので、このままではクリックしても目的のファイルにアクセスすることはできません。クリックしたら目的のファイルにたどり着けるようにカスタマイズしてみます。

ページの編集画面に戻って、結果リストオブジェクトの編集ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7abd03c4-f852-108e-9d74-e6f8a83a5480.png)

コードの編集をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/fa5e384f-664b-d0b3-5fca-c512ed3a0c73.png)

右側のコードの欄でHTMLタブを選択すると、HTMLのソースを編集してカスタマイズすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a4363588-d481-7999-a1a1-b99f2e68010c.png)

元のソース

```html:変更前
<div class="template-list template-list1-<%= guid %>" onclick="clickMoreHandler()">
  <% items.forEach(function(item, i){ %>
    <div class="template-root<%= item.uniqueId == selectedId ? ' template-selected' : '' %><%= item.elevated === 'true' ? ' template-elevated' : '' %>">
      <div class="template-title"><a class="template-link" href="<%= item.link %>"><%- item.title_h || item.title %></a></div>
      <% if (item.date) { %>
        <div class="template-date"><b>Date:</b> <%= item.date %></div>
      <% } %>
      <div class="template-subtitle"><%- typeof(showMoreValues) !== 'undefined' && showMoreValues[i] || item.subtitle_h || item.subtitle%></div>
      <div class="template-link-text"><%= item.link %></div>
    </div>
  <% }); %>
</div>
```

以下のように編集します。

```html:変更後
<div class="template-list template-list1-<%= guid %>" onclick="clickMoreHandler()">
  <% items.forEach(function(item, i){ %>
    <div class="template-root<%= item.uniqueId == selectedId ? ' template-selected' : '' %><%= item.elevated === 'true' ? ' template-elevated' : '' %>">
      <div class="template-title">
        <!-- <a class="template-link" href="<%= item.link %>"><%- item.title_h || item.title %></a> -->
         <% var url = item.link.replace('winfs:', 'http:').replace('c:/', ''); %>
         <a class="template-link" href="<%= url %>"><%= decodeURIComponent(item.title.replace('winfs://xxx.xxx.xxx.xxx/c:/oneWexTest03/', '')) %></a> 
      </div>
      <% if (item.date) { %>
        <div class="template-date"><b>Date:</b> <%= item.date %></div>
      <% } %>
      <div class="template-subtitle"><%- typeof(showMoreValues) !== 'undefined' && showMoreValues[i] || item.subtitle_h || item.subtitle%></div>
      <!-- <div class="template-link-text"><%= item.link %></div> -->
      <div class="template-link-text"><%= url %></div>
    </div>
  <% }); %>
</div>  
```

item.linkの値の、winfs://...部分を、http://...というように、IISで公開したアドレスに変換しています。IPアドレス部分はマスキングしていますが(xxx.xxx.xxx.xxx)、ここはWindowsServerのアドレスが入ります。(変換先のフォーマットは、当然のことながらファイルの公開方法に依存します。)
さらに、表示部分はURLエンコードされてしまうと分かりにくいので、デコード処理を入れています。

これで保存しなおしてアプリケーションを実行してみると、結果のリスト表示がデコードされて見やすくなりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ece164e1-d396-0ca3-eb91-bac64c1a9104.png)

さらに、リンクをクリックすると、ブラウザの機能でファイルのダウンロード&アプリで直接ファイルを開くことができるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/db0629a3-1ae6-2ad1-1b2e-b2343a794e4c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/53b64f73-cea8-c83c-3484-2308154d555c.png)

#まとめ
とりあえず、ApplicationBuilderを使用して、検索して結果を表示してリンクをクリックしたらファイルをブラウザ経由でダウンロードしてファイルを適切なツールで開く(Word/Excel/PDFなど...)ということを実現するアプリはサクッと作れました。
ただし、これ以上のことをやろうとすると、なかなか壁にぶち当たることが多く、難儀します。
他のウィジェットとかもあるようですし、カスタマイズの余地も色々あるのですが、いかんせんマニュアルの情報が少なすぎて、使ってみて試行錯誤しながら進めないといけないですし、問題判別の情報も少なすぎて、問題発生時にすぐに行き詰ります。単純なアプリケーション以外であれば、プロトタイプや動作確認用アプリとして作成するためのツール、くらいの位置づけで考えておいた方が無難な気がします。
本命としては、API使って一からアプリ作るのがよいのではないかと思います。