Boxとelastic Searchつないでみた
コンテンツ
#boxとelasticsearch
boxの検索には、制限がある。 box community記事より抜粋:
Box は、ファイル内のキーワードに依存して、文書ごとに 1 万の全文検索文字を格納します。Box の検索索引では、多数の異なるトークン化およびストップワード削除フィルタが使用されます。
つまり、1万バイトを超える文書内の文字列については検索対象とならず、boxの検索候補に出てきません。 毎日使っている自分からすると、実はそんなにこの制限のせいで困ったことはないです。 大抵探している単語ってのは、文章中の1万バイト未満で出てくるので、多くのドキュメントは探せます。
ファイルサーバーを使ってた時代は、検索すらできなかったので(できても数時間放置してやっと検索結果が全部出揃うレベル)、それに比べたら全然マシ。
しかし、本当にフルテキスト検索ができないと困るという人もいる。 よく聞くのが、保険外交員や研究員が保険適用の過去事例や研究論文を探し出すのにフルテキスト検索ができないと困るそうです。
いちおうBoxでも検索可能ファイルサイズを大きくするという噂はあるけどいつになるかわからない。 そしたら、検索システムと連携して自分で作っちまおうということでelastic searchの登場です。 boxとelastic searchを連携してFull Text検索を実現しちゃうおう。 以下アプリは他のbox社員がPoCで作成したアプリケーションになります。 box elastic search
注意:これはコンセプトアプリケーションです。本番環境での運用には気をつけてください。理由は後述します。
事前準備
以下を事前に入れておく必要があります。 elasticsearch kibana node yarn
導入方法
1. 以下のレポジトリをclone
git clone https://github.com/kylefernandadams/box-elasticsearch
2. 必要node packageをインストール
|
|
3. boxのjwt jsonを取得する
Box CLIを使おうのこのあたりを参照してJSONファイルをダウンロードしてください。
↑スコープに注意: エンタープライズスコープを許可してください。
ダウンロードしたら、box_config.jsonとリネームします。
リネームしたら、box-elasticsearchフォルダのルートに置きます。
4. 検索設定
このデモアプリでは、boxエンタープライズイベントから検索対象のアイテムを取得してきます。 つまり、テナント内のすべてのドキュメントが検索対象となってしまう恐れがあります。ElasticSearchにアクセス権があるユーザーはすべてのドキュメントが見れてしまいます。 検索対象とする日付やファイルタイプは以下設定ファイルで調整できます
app_config.json
|
|
5. indexスタート!
まず、elastic searchとkibanaのサービスをスタートします。 使用しているOSによってサービス起動方法は異なるので、各自調べてくださいな elasticsearch kibana
上記2つのサービスが無事起動したら、今回のアプリを起動します
yarn start
起動すると、boxのエンタープライズイベントを検知して以下のようにガンガンindexがかかるはずです。
|
|
さて、indexが一段落したら検索可能な状態にして上げる必要があります。 http://localhost:5601/ にアクセスしてindexを設定します。
Management > Indexを選択
Index名に適用な名前をを入れる
Filterにcreated_atを設定したら完了
検索してみよう
ここまで設定したら、フルテキスト検索が可能になっているはず。
左上のDiscoverを選択して、Time Rangeをいじります。
デフォルトだと、15分以内にアップロードされたファイルが検索対象となっています。適宜設定しなおしてくれぃ。
indexの調整
indexのマッピング情報はこちら: ここに情報を追加すれば、Elasticsearch上のindex情報を追加出来る https://github.com/kylefernandadams/box-elasticsearch/blob/master/index/type-mapping.json
event情報のパーサーはこちら: https://github.com/kylefernandadams/box-elasticsearch/blob/master/events/events-parser.js
Index用にひっぱってくるファイルの情報はBox Representation APIを使用: https://github.com/kylefernandadams/box-elasticsearch/blob/master/events/text-extractor.js
[text-extraction]だけをひっぱってくるので、生データよりもかなりデータ量を減らすことが可能となります。
Box Representaion APIの説明はこちら
まとめ
さて、検索indexを貼れるようになったはいいものの、こういったfull textソリューションの難しいところは、検索結果のセキュリティをどうやって担保するか? 以下のことを考慮する必要があります。
indexとして引っ張ってくるユーザーの権限
- どのコンテンツを引っ張ってくるのか?
- 企業内すべてを引っ張って良いのか?特定のコンテンツだけをひけるようにするべきなのか?
プレゼンテーションをどうするべきか?
- せっかくbox上でアクセス制限しているのに、full textアプリ側でなんでもかんでも見れるようにしてしまっては意味がない。
- 誰にどのコンテンツを見せるのか?
- box上のセキュリティ権限と合わせるのか?合わせる必要があるのか?
- 日々アップデートされるコンテンツのセキュリティ権限をどうやって同期するのか?
Boxに限ったことではなく、どのシステムと組み合わせても上記の設計は必要になってきます。 Box + Elasticsearchを組み合わせて使用している他社のお客様事例だと、Enterprsie Eventではなく特定のフォルダのみfull text対象としているようです。 そしてKibanaにアクセス出来る人を検索対象としているboxフォルダにアクセス権がある人に絞っているそうです。
“full text検索”って聞こえは良いけど、一番重要なのはなんのためにこのシステムを開発したいのか?目的をはっきりとしておくこと。そうしないと車輪の再開発になってしまう。
作成者 Daichi
最終更新時刻 2019-08-16