全文検索エンジン~Apache Solr~をざっくり&きっちり

# 目次
　1. はじめに
　2. 検索エンジンの基礎知識
　3. Apache Solrを使ってみる
　4. Solr + Banana によるデータ可視化
　5. あとがき

# 1. はじめに
どうも、EEIC2015の@nobi_sannです。[EEIC Advent Calendar](http://qiita.com/advent-calendar/2015/eeic)の12/19分を担当させていただきます。カレンダーの方では「東京大学電気系縦断忘年会」と登録したのですが、何やら主旨を間違えていたのか一人だけ本当のカレンダーとして使ってしまっていたことが判明し、その後続々と登録される他の方のガチっぽい題名を見た瞬間に

![CTLunYwUkAEAGlJ.jpg](https://qiita-image-store.s3.amazonaws.com/0/103610/6b677d4b-7b04-0a00-5c4e-54e1e93596c7.jpeg)

となる羽目に。

しかし安心してください。書くネタはちゃんと用意してきました。
題名の通り、今回は検索エンジンについてのお話になります。

注.初めての人向けに書いていたら長くなりそうになってきたので大雑把な話が多いかもしれません。ご了承ください。

# 2. 検索エンジンの基礎知識
検索エンジンと聞くとまず最初に思い浮かぶのがgoogle,Yahooなどのweb検索エンジンですね。他にもexcite,百度なんてのもあります。ですが検索はwebページに対してだけ行う行為ではありません。今回は**全文検索エンジン**というものを紹介したいと思います。

全文検索エンジンとは端的に言って沢山の文書から特定の文字列を見つけてくるソフトウェアのことです。この説明のままではあまり面白さを感じられないかもしれません。むしろ簡単そうに聞こえるでしょうか？
ではユーザーが料理の大量のレシピ(データベース)に対して冷蔵庫の食材を検索クエリとして投げた時に、季節や時間帯、目的や栄養バランスに基づいた他の副菜も併せた形で献立が提供されることが求められるとしたらどうでしょうか？中々難しそうです。そう、例えばCookpadさんは後述するApache Solrという全文検索エンジンを用いています。全文検索エンジンには他にもGroonga(グルンガ),Elastic Search,Sennaなどのソフトウェアがあります。

### ユーザーはどんな検索結果(過程)を求めているのか？

googleなどの大規模で主流の検索エンジンがとっっても良く出来ているのでその色々な恩恵を私たちは日々意識することなく利用出来ていますが、”気持ちのいい”検索が可能になるには結構な性能が求められます。 
- 大前提として適合率、再現率が高いこと
- 曖昧だったり間違った言葉だったりしてもそれを正しい検索結果に導いてくれること
- わざわざ入力を全部しなくても補完してくれるサジェスチョンなどのUIを向上させる色々な機能

実装側はこれらを満たし、ユーザーの要求に価値ある結果を返さなくてはいけません。間違った料理を運んできてしまうと……

![hikakin.jpg](https://qiita-image-store.s3.amazonaws.com/0/103610/4492ee3e-9abc-b3ee-54cb-cd1ce4035612.jpeg)
###### お客さんに怒られちゃう！


さて簡単な説明はこれでおしまい。次章では皆さんのpcに検索エンジンを実際にぶっ建てちゃいます。

# 3. Apache Solrをつかってみる
**前置きはともかく実際の検索エンジンを使ってみるぞ！**

Apache solrはオープンソースの全文検索エンジンです。Apache Luceneをベースにwebアプリケーションとして使えるようになった色々便利なやつです。まぁとにかく今回はこれを使います。
### Solrの特徴
**速い**…マジで速い。噂では7億ドキュメント(インデックスサイズ3.5TB)でも1秒以内に返ってくるらしい。

**分散インデックス、レプリケーションなどの機構を備える**…インデックスが大規模になった時にマスタースレーブを作ったり、インデックスを分割したりとサーバーの負荷を軽減して高速検索を可能にする色々な機能がある

**ファセット機能**…絞り込みってやつ。検索結果の中の「ある属性」に関して件数がわかったりと便利。この機能を備える検索エンジンは商用でも少ないらしいよ。しかもMySQLの数十倍高速なんだって。まぁとにかくSolrは速いとだけ知っていただければ。

**地理空間検索**…実はこの記事を書くまで僕も知らなかった機能。色々な可能性を感じる。

###インストールと起動方法


**準備** : javaのインストール

- macの場合

javaのバージョンを確認しましょう。

``` 
$ java -version
```
macはあらかじめバージョン1.6以上がインストールされているので確認だけでok。

- linuxの場合

```
$ sudo apt-get install oracle-jdk7-installer
```
としてインストールし、環境変数JAVA_HOMEの設定と$JAVA_HOME/binにパスを通します。~/.bash_profileを開き

```
export JAVA_HOME=/usr/java/default
PATH=$JAVA_HOME/bin:$PATH:$HOME/bin
```

と追記。読み込み直してから(ログインし直す)
`$ java -version`
と打ってjavaのバージョンが1.7であれば成功です。次にインストールに移ります。

 [ミラーサイト](http://ftp.tsukuba.wide.ad.jp/software/apache/lucene/solr/)から solr-4.10.4.zip(または.tgz)をダウンロードしましょう。今回使うバージョンは4です。Apacheのアーカイブからだと結構時間かかります。ダウンロードして解凍するとディレクトリにはsolr-4.10.4というサブディレクトリができるのでこれを$SOLRと今後呼ぶことにします。
以上でSolrのインストールは終了です。次は起動してみましょう。
コマンドラインから次のようにexampleディレクトリまで移動してstart.jarファイルを起動します。

```
$ cd $SOLR/example
$ java -jar start.jar
```

で起動できます。
もしエラーが生じて

```
Address already in use
```
と表示された場合、Apacheの終了がうまくいってない可能性が高いので

```
$ lsof -i :8983
```
でプロセス番号を確認して

```
$ kill [プロセス番号]
```
すればいけるはず。
起動が成功したら超ショボいですがサンプルインデックスも作ってしまいましょう。

```
$ cd $SOLR/example/exampledocs
$ java -jar post.jar *.xml
```
でサンプルのxmlファイルデータをSolrにPOSTします。

http://localhost:8983/solr にアクセスしてみてください。Solrの管理画面が表示されたら**おめでとう！**今日からあなたも自分で検索システムを構築することが出来ます。色々いじってどんな機能があるかを調べてみてください。左のメニューからコア(collection1)を選択したらqueryで簡単な検索ができます。これ以上の手ほどきはここではしませんが、現状インデックスもショボいし折角インストールしてもらったんだから……ということで一つ遊び方を紹介します。
[SolrにWikipediaのデータを入れて遊ぶ](http://www.mwsoft.jp/programming/munou/wikipedia_solr.html)
インストール方法やらも書いてあるならわざわざ自分が書かなくても良かったのではと思ったけどこの記事ではSolr3なので一応バージョン4の方ならこのようにして出来ますよという保証にはなるのでは。

# 4. Solr + Flume + Bananaによるデータ可視化
さて最後のテーマになります。3つのOSSを使ってデータ可視化をしてみようという試みです。といってもかなり方法は
[OSSのツール「Solr」「Flume」「Banana」の組み合わせによるデータ可視化プラットフォーム構築](http://codezine.jp/article/detail/8707)
を参考にする、というか偉そうなことを言っておきながらほぼ丸写しなので申し訳ないです。しかも**自分のmacではビルド出来ませんでした(爆)。**学科pcの方ではなんとか出来ました。色々javaのバージョンだの環境変数だのが問題だった気がする。夏休みのことなので覚えていないのが申し訳ないです。まぁ皆んななら出来るでしょう！
この三つの中でSolrはインデックスとクエリに対しての結果を返す、つまりDWH(データウェアハウス)の役割を持っているようです。BananaはもともとElastic Search用のanalytics and search dashboardであるKibanaをSolr用に開発したもので、D3.jsを用いているとのこと。
長い作業になるので結果に天下りに到達しちゃいますね。
こんな感じです。
[Getting to know your Solr users with LucidWorks Banana](http://engineering2success.blogspot.jp/2014/07/solr-user-metrics-with-banana.html)

触ってみた感想
**データが可視化されてる！**
というのは冗談として、情報可視化実験では色々ユニークな可視化が行われていたのですが、このbananaでは普通な感じのグラフで統計や解析をする感じでした。ちなみにkibanaの方が画面が黒くてかっこいい感じがします。
[参考画像](https://www.google.co.jp/search?q=kibana&safe=off&espv=2&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiO2rX1y-XJAhUFLKYKHccuDJYQ_AUIBygB&biw=1225&bih=678&dpr=2)


# 5. あとがき
というわけであまり多くの人が興味を持つような話題ではなかったかもしれませんが、Solrに関しての紹介をこれで終わりにしたいと思います。
そもそもSolrとの出会いはインターンなのですが、僕がやっていたことは

- TokenizerとComponentを上手く設定して日本語と英字が入り乱れさらに"間違った"クエリでも正しい結果を返す(レーベンシュタイン距離とか使います)
- インデックスからデータを物故抜いてきて新しく情報を付加してまたインデックスに物故むとかのクライアントプログラミングの面
- 特定の属性に関してサジェスト機能を作ってチューニングする

など色々あるのですが本稿ではうまく説明できないというか、長くなりすぎるのでSolrの紹介にとどめます。もっとわかりやすい成果物があればよかったと思います。残念ながらこの記事を書くにあたって何か面白い試みをしようかと思ったのですが、ちょっと無理でした。物足りない感じですみません。

この先もっと情報検索の世界に関わろうと思う人は色々調べてみたら楽しいかもしれません。そして出来たら面白いもの・スゴいものを作ってみて欲しいナァ。


### **まぁともかく今日は電気系縦断忘年会ってことで皆さんアゲていきましょう！！**

ここまで読んでくれた人、飲み会来てくれる人、ありがとね!!(◍•ᴗ•◍)




※某Youtuberの画像もし著作権的に問題あったらすぐ連絡ください。ではでは
![7540f9a7-l.jpeg](https://qiita-image-store.s3.amazonaws.com/0/103610/c1f5a037-ec43-d979-c0aa-72d8b1d8027f.jpeg)