Watson Discovery で PowerPoint も Excel もクロールして取り込む

Watson Discovery で取り込めるファイル形式は Word、PDF、HTML、Json になりますが、以下の記事で紹介している Nutch を使用すると PowerPoint や Excel 等、Discover がサポートしていない形式のファイルも取り込み可能です。

[Watson Discovery で Web クローリング（１）](https://qiita.com/schiyoda/items/4fd68b7299807e9ff1f1)
[Watson Discovery で Web クローリング（２）](https://qiita.com/schiyoda/items/48634ce98eda1572bbab)

Nutch では Web クロールをする代わりに、ファイルシステムをクロールするように設定することができます。また、Nutch は内部的にオープンソースのパーサーである　Apache Tika を使用しており、この Apache Tika が PowerPoint や Excel を含むさまざまなフォーマットのファイルからテキストやメタデータを
抽出することができます。以降では Nutch でファイルシステムをクロールする手順を紹介します。

# 設定手順

### ソースコードの取得&ビルド
Github 上のソースコードを以下のように取得します。

```console
git clone https://github.com/schiyoda/nutch-indexer-discovery.git -b file
```

[こちらの手順](https://qiita.com/schiyoda/items/4fd68b7299807e9ff1f1)と同じように buildPlugin まで進めます。

```console
$ ./gradlew
$ ./gradlew setupHbase
$ ./start-hbase.sh
conf/nutch-discovery/nutch-site.xml の修正
$ ./gradlew setupNutch
$ ./gradlew buildPlugin
```


>### 少し解説
取得したソースコードは[こちら](https://github.com/IBM-Watson/nutch-indexer-discovery)にあるものに対し、ファイルシステムクロールのために以下のような修正をしています。
#### nutch-site.xml の修正
ファイルシステムクロールのために、plugin.includes で protocol-httpclient の代わりに protocol-file を指定します。また、ファイルのメタデータの取得のために、parse-metatags、index-metadata を追加します。
#
```xml:nutch-site.xml
  <property>
    <name>plugin.includes</name>
    <!-- do **NOT** enable the parse-html plugin, if you want proper HTML parsing. Use something like parse-tika! -->
    <value>protocol-file|urlfilter-regex|parse-(text|tika|js|metatags)|index-(basic|anchor|metadata)|query-(basic|site|url)|response-(json|xml)|summary-basic|scoring-opic|urlnormalizer-(pass|regex|basic)|indexer-discovery</value>
  </property>
```
さらに以下の設定を追加します。各々、
file.crawl.parent: ファイルシステムを指定フォルダから子方向にクロールする
file.content.limit: 取得するファイルサイズを無制限にする
index.metadata: 取得するメタデータの指定
#
```xml:nutch-site.xml
  <property>
    <name>file.crawl.parent</name>
    <value>false</value>
  </property>
  <property>
    <name>file.content.limit</name>
    <value>-1</value>
  </property>
  <property>
    <name>index.metadata</name>
    <value>Last-Modified</value>
  </property>
```
#### hbase-site.xml の修正
クロールが途中で止まるエラーに対する対応
#
```xml:hbase-site.xml
  <property>
    <name>hbase.regionserver.lease.period</name>
    <value>1200000</value>
  </property>
```

### クロールの設定
seed/url.txt にクロールするファイルシステムの最上位のフォルダを記載します。

```text:url.txt
file://Users/chiyoda/work/docs/
```

> フォルダ名の最後に / （スラッシュ）を付ける必要があるようです。

build/apache-nutch-2.3.1/runtime/local/conf/regex-urlfilter.txt を修正し、デフォルトでは有効になっていないファイルクロールを有効にします。また PowerPoint や Excel がクロールの対象になるように修正します。

```text:regex-urlfilter.txt
# skip file: ftp: and mailto: urls
-^(ftp|mailto):

# skip image and other suffixes we can't yet parse
# for a more extensive coverage use the urlfilter-suffix plugin
-\.(gif|GIF|jpg|JPG|png|PNG|ico|ICO|css|CSS|sit|SIT|eps|EPS|wmf|WMF|zip|ZIP|ppt|PPT|mpg|MPG|xls|XLS|gz|GZ|rpm|RPM|tgz|TGZ|mov|MOV|exe|EXE|jpeg|JPEG|bmp|BMP|js|JS)$
```

それでは、クロールしてみます。

```console
$ ./crawl
Injecting urls from ./seed/urls.txt
./build/apache-nutch-2.3.1/runtime/local/bin/nutch inject ./seed/urls.txt
InjectorJob: starting at 2018-06-01 15:06:10
InjectorJob: Injecting urlDir: seed/urls.txt
InjectorJob: Using class org.apache.gora.hbase.store.HBaseStore as the Gora storage class.
InjectorJob: total number of urls rejected by filters: 0
InjectorJob: total number of urls injected after normalization and filtering: 1
Injector: finished at 2018-06-01 15:06:14, elapsed: 00:00:03
Generate urls: 
./build/apache-nutch-2.3.1/runtime/local/bin/nutch generate -topN 5
GeneratorJob: starting at 2018-06-01 15:06:16
GeneratorJob: Selecting best-scoring urls due for fetch.
GeneratorJob: starting
GeneratorJob: filtering: true
GeneratorJob: normalizing: true
GeneratorJob: topN: 5
GeneratorJob: finished at 2018-06-01 15:06:19, time elapsed: 00:00:03
GeneratorJob: generated batch id: 1527833176-1112895280 containing 1 URLs
Fetch urls: 
./build/apache-nutch-2.3.1/runtime/local/bin/nutch fetch -all
FetcherJob: starting at 2018-06-01 15:06:21
FetcherJob: fetching all
FetcherJob: threads: 10
FetcherJob: parsing: false
FetcherJob: resuming: false
FetcherJob : timelimit set for : -1
Using queue mode : byHost
Fetcher: threads: 10
QueueFeeder finished: total 1 records. Hit by time limit :0
fetching file:///Users/chiyoda/work/docs/ (queue crawl delay=5000ms)
-finishing thread FetcherThread1, activeThreads=1
-finishing thread FetcherThread2, activeThreads=1
-finishing thread FetcherThread3, activeThreads=1
```

クロールを複数回実行すると、ファイルが Discovey に取り込まれたことが確認できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/56e74983-3968-33a2-c602-dfb07a2ffb73.png)

各フォルダの情報も一件として取り込まれてしまうようなので、検索時には以下のような条件設定をした方がよいかもしれません。

```console
title:!"Index of /Users/chiyoda/work/docs"
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/b4b31f97-b3e2-15b7-ee89-d235377097e3.png)