付属クローラツールを使ってファイルシステム上のコンテンツをWatson Discoveryに取り込む

( 内容としてはそれぞれ独立していますが、[ManifoldCFを使って、Webのニュース記事をローカルファイルに落とす](https://qiita.com/makaishi2/items/3c101c2494be4e119402)の記事の続きです。)

## はじめに
Watson Discoveryでは、データの取込み方法として次の3つの方法があります。

1. Discovery付属のユーザーインターフェイスを用いる方法
2. APIを用いる方法
3. 付属クローラを用いる方法

とりあえず試してみるレベルででは1.の使い方が、すでにコンテンツがきれいに整備されていて、あとは　Discoveryにデータを入れるだけの場合は2.の使い方が一番簡単かと思いますが、例えばWEB上の特定のサイトの内容をDiscoveyに取り込みたいとか、ファイルサーバーに入っているデータを Discoveyに取り込みたいなどの場合は、3.のクローラを使って取り込む方法が一番便利になります。
以下では、上のリンクに記載したユースケース(別のクローラソフトを使って取り込んだ特定のサイトのコンテンツがファイルシステム上にすでに存在している)を例にとり、Discovey付属のクローラの使い方を簡単に解説します。

## 前提環境
実は、このクローラの正式なサポート対象プラットフォームはLinuxのみとなっています。
しかし、コードはPure Javaで実装されており、私が手元のMac(High Sierra 10.13.2)で動かしても特に問題は見つかっていません。
同じMac環境で利用される場合は、あくまでサポート対象外であることをご理解の上で利用としていただきたいと思います。
なお、動作確認は行っていませんが、パッケージの中にはWindowsのバッチファイルも含まれているので、Windowsに関しても同じような位置付け(正式サポートはないが動作はする)ではと考えられます。

## Discoveryインスタンス側の準備
初めてDiscoveryを利用する場合は、事前準備として

- Discoveryインスタンス作成
- コレクション作成
- 構成ファイルのカスタマイズ

などの作業が必要です。
この手順については [Watson Discovery Serviceが日本語対応したので、触ってみた【何、それ？】編](https://qiita.com/ishida330/items/b823d7c5b55806f04242)に詳しく説明されているので、こちらを参照されてください。
日本語コンテンツが対象の場合、昨年末にリリースされたばかりということもあり、分かりにくい点があります。
ポイントだけ記載すると

1. **UIツールから日本語コレクションを作成できない** -> コレクション作成のみAPIで実施(curlコマンドを使うのが一番簡単です)。これ以降の管理タスクは日本語コレクションであってもUIから実施可能
2. **日本語コレクションではデフォルトの構成ファイルのままではデータ取込み時にエラーになる** ->デフォルト構成ではまた日本語化できていないNLU呼び出しが含まれているため。構成ファイルのカスタマイズを行い、NLU呼び出しを行わない構成とする 

となります。詳細は上記リンク先に説明されているので、そちらを参照してください。

## クローラのダウンロード
クローラのダウンロードサイトはわかりにくいです。IBM Cloudのダッシュボードから作成済みDiscoveyインスタンスをクリックすると、次のようなインスタンス管理の初期画面が表示されます。
この画面下方、赤枠で囲んだ部分にダウンロードサイトのリンクが表示されています。
Linux以外のプラットフォームで使う場合は、このうちzipによるパッケージをダウンロードする形になります。
将来リンクが変更になる可能性はありますが、現時点でのダウンロードリンクは [クローラダウンロード](http://ibm.biz/watson-crawler-zip)になります。

![スクリーンショット 2018-01-12 11.05.29.png](https://qiita-image-store.s3.amazonaws.com/0/206130/62f8fa48-48fa-8dce-05cb-457bf743e0c2.png)

## パッケージのファイル構成
ダウンロードしたzipファイルを解凍すると、次のようなファイルツリーとなります。(説明に不要のところは一部省略しています)

![スクリーンショット 2018-01-12 11.43.24.png](https://qiita-image-store.s3.amazonaws.com/0/206130/0417b7b4-4f19-9c78-f224-2cc16d8aaf9c.png)

## 構成ファイルについて
上図のファイルツリーの中で、sahre/examplesの配下には、クローラの構成ファイルの雛形が含まれています。
具体的な中身は、下図の通りです。

![スクリーンショット 2018-01-12 11.43.55.png](https://qiita-image-store.s3.amazonaws.com/0/206130/714afd90-6529-cfce-72be-e81e97b0202d.png)

クローラを使う際は、この雛形構成ファイルをツリーごとコピーし、コピー先を編集して使う形になります。

クローラの実行モジュールは bin/crowler なので、クローラを実行する時はいくつかの構成ファイルに修正を加え、

```
$ bin/crawler <crowler command> --config <config path>
```

のように修正した構成ファイルをパラメータで指定して呼び出す形になります。

## 構成ファイルの修正点
上の画面コピーを見ていただければわかるように、クローラは

- ファイルシステム
- Box
- データベース
- samba
- sharepoint
- cmis

など、いくつかのクロール対象をサポートしていて、それぞれについて構成の方法が異なります。
個々の詳細の設定については、[オンラインマニュアル](https://console.bluemix.net/docs/services/discovery/data-crawler-discovery.html#configuring-the-data-crawler)などを参照していただくこととし、この記事では冒頭で説明した「ファイルシステムをクロール対象とする」ケースについて、配布時の状態(config-example)と正常にクローラが動作するようになった状態(config)の構成ファイルのツリーでdiffを取った結果を以下に添付します。そもそもが、この雛形がファイルクロール用に作られているようで、変更点は非常に少なかったです。
具体的な変更点は、config/discovery/discovery_service.conf配下のAPI接続情報の設定と、config/seeds/filesystem-seed.conf配下のクロール対象ディレクトリの設定のみでした。

```
diff -r config/discovery/discovery_service.conf config-example/discovery/discovery_service.conf
15c15
<   environment_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
---
>   environment_id = "CHANGE_TO_YOUR_ENVIRONMENT_ID",
17c17
<   collection_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
---
>   collection_id = "CHANGE_TO_YOUR_COLLECTION_ID",
19c19
<   configuration_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
---
>   configuration_id = "CHANGE_TO_YOUR_CONFIGURATION_ID",
32,33c32,33
<     username = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
<     password = "xxxxxxxxxxxx"
---
>     username = "CHANGE_TO_YOUR_USERNAME",
>     password = "CHANGE_TO_YOUR_PASSWORD"
diff -r config/seeds/filesystem-seed.conf config-example/seeds/filesystem-seed.conf
10c10
<       value="sdk-fs:///Users/makaishi/rep1/http/news.livedoor.com/"
---
>       value="sdk-fs:///CHANGE/THIS/WITH/YOUR/OWN/URL"
```

クロール対象がファイルシステム以外の場合は、config/crawler.confの以下の行の変更を行う形になります。

```
    # The configuration for the Connector Framework.
    connector_framework = {
      # The file containing the connector configuration for the crawl.
      crawl_config_file = "connectors/filesystem.conf",

      # The file containing the seed URL for the crawl.
      crawl_seed_file = "seeds/filesystem-seed.conf",
```


## クロールのテスト、初期実行、差分実行

構成ファイルの変更が終わったら、動作確認を行います。
クローラにはdry-run(実行はするが、実際にデータのimportは行わない)のモードが用意されているので、このモードで呼び出して実行することでテストを行います。
実行コマンドは、次のような形式となります。

```
$ bin/crawler testit --config <config path>/crawler.conf
```

testitのコマンドがdry-runモードの指定を意味します。
--config では、crawler.confファイル(最上位の構成ファイルとなります)のパスをフルパスで記載します。

正常に動作している場合は、以下のようなメッセージが表示されます。

```
$ bin/crawler testit --config ~/wds-crawl/config/crawler.conf 
2018-01-15 10:41:43,522 INFO: Connector Framework サービスが開始され、ポート 61882 上のクローラーに接続されます
2018-01-15 10:41:44,448 INFO: このクロールは Test-It モードで実行されています
2018-01-15 10:41:44,449 INFO: 構成されたシードに一致する場合、構成された出力アダプターに最大 1 つの項目が送信されます。
2018-01-15 10:41:44,450 INFO: シードが処理された後、それ以後にエンキューされた最大 5 の URL が表示されますが、取得されません。
2018-01-15 10:41:44,451 INFO: クロールを実行しています...
2018-01-15 10:41:44,458 INFO: 次のパターンと一致する URL は処理されません: (?i)\.(xlsx?|pptx?|jpe?g|gif|png|mp3|tiff)$
2018-01-15 10:41:44,514 INFO: HikariPool-1 - Starting...
2018-01-15 10:41:45,117 INFO: HikariPool-1 - Start completed.
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.ReflectUtils$2 (file:/Users/makaishi/crawler-2.1.4/bin/tmp/viv_jpf_shadow_crawler-fs-sdk-fs_tsaff/filesystem.plugin@1.0.0.0-SNAPSHOT/lib/guice-2.0-v2.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.ReflectUtils$2
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Test-It がクロールされました: sdk-fs://localhost/Users/makaishi/rep1/http/news.livedoor.com/%25E6%2596%258E%25E8%2597%25A4%25E4%25BD%2591%25E6%25A8%25B9
Test-It がクロールされました: sdk-fs://localhost/Users/makaishi/rep1/http/news.livedoor.com/%25E5%258D%2583%25E8%2591%2589%25E7%259C%258C
Test-It がクロールされました: sdk-fs://localhost/Users/makaishi/rep1/http/news.livedoor.com/%25E8%25A7%2592%25E9%2587%258E%25E5%258D%2593%25E9%2580%25A0
Test-It がクロールされました: sdk-fs://localhost/Users/makaishi/rep1/http/news.livedoor.com/%25E8%25BF%2591%25E8%2597%25A4%25E3%2581%258F%25E3%2581%25BF%25E3%2581%2593
Test-It がクロールされました: sdk-fs://localhost/Users/makaishi/rep1/http/news.livedoor.com/%25E3%2582%25B5%25E3%2582%25A4%25E3%2582%25BC%25E3%2583%25AA%25E3%2583%25A4
2018-01-15 10:41:53,757 INFO: Connector Framework Input Adapter のサービスの一時停止のシグナルがありました。
クローラーを完全にシャットダウンしようとしています。
```

エラーとなった場合は、エラーメッセージを分析して問題を解決してください。
テストが正常終了したら、いよいよ実際にDiscoveyのコレクションにデータ取込みを行います。
この場合、コマンドとしては"crawl"を指定する形になります。

```
$ bin/crawler crawl --config <config path>/crawler.conf
```

また、実際にファイルシステムの内容をDiscoveryに取り込む運用を行う場合、定期的に差分取込みを行う必要があります。この場合は、"refresh"というコマンドが用意されていて、このコマンドを使う形になります。

 ```
$ bin/crawler refresh --config <config path>/crawler.conf
```


###(おまけ)News記事を取り込んだDiscoveyの画面サンプル
シリーズになっている別の書き込みとあわせてここまでのことを行うと、ニュースサイトの記事をDiscoveyに取り込むことができます。どんな結果になるか、画面のサンプルをいくつか添付します。

(スキーマ表示画面例)
![スクリーンショット 2018-01-12 16.00.42.png](https://qiita-image-store.s3.amazonaws.com/0/206130/f76b75e1-39ec-edd8-b763-172d034e254a.png)


(Query結果画面例)
![スクリーンショット 2018-01-12 16.03.00.png](https://qiita-image-store.s3.amazonaws.com/0/206130/f248821e-50fc-0b8f-f528-d0022535317f.png)


###(補足)コンテンツファイルの種別判断について
実は、このやりかたでlibedoorのニュースサイト記事のダウンロードを行うと、記事の一つ一つが静的HTMLでなく、動的に生成されるものであるため、個々の保存ファイルは拡張子htmlがついていない状態になります。このままDiscoveyに取り込んで大丈夫か最初は心配だったのですが、結果からいうと問題なく取り込めるようです。拡張子だけでなく、ファイルの内容を見て、どの種類のファイルを取り込んでいるのか判断する仕組みがどこか(おそらくクローラ側)にあるようです。