UNIX的なアレ

UNIX的なこととかいろいろ

elasticsearchでらくらく全文検索


検索エンジン選びは大変です!現時点でnanapiではmroongaを使っていますが、もっと検索エンジンらしい機能がほしくなったりします。
またそれ以外にも今後拡張するだろう機能をカバーしきれないような予感が徐々にしているので、ゆるゆると検索エンジンを検証し始めています。

そんななか、elasticsearchがイケてるらしいという情報をキャッチしたので使ってみました。今回はelasticsearchを簡単に動かすまでのチュートリアル的なものを紹介します。

Free and Open Search: The Creators of Elasticsearch, ELK & Kibana | Elastic

elasticsearchとは?

Apache Lucene上で稼働する全文検索エンジンです。
特徴としては、REST APIをもちJSONですべてやり取りできるところです。このあたりから、かなりとっつきやすいと感じる方も多いのではないでしょうか。また、稼働させるまでもものすごく簡単にできるのでぜひ興味がある方は試してみてください。

elasticsearchをインストールする

まず、javaが必須です。私は普段はjavaは書かないため新しくインストールしました。なお、今回の手順はCentOS5.8で実施しています。yumとかで古いjavaが入るのも嫌だったので、最新のrpmを落としてきてインストールしました。
http://java.com/ja/download/manual.jsp

適当にホームディレクトリ直下で作業するので、気になる方は読み替えてください。

$ sudo rpm -ivh jre-7u9-linux-x64.rpm
$ test -d ~/elasticsearch || mkdir ~/elasticsearch && cd ~/elasticsearch
$ wget http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.2.tar.gz
$ tar xf elasticsearch-0.20.2.tar.gz && cd elasticsearch-0.20.2
$ ./bin/elasticsearch -f
[2012-12-28 04:15:35,015][INFO ][node                     ] [The Wink] {0.20.2}[22685]: initializing ...
[2012-12-28 04:15:35,023][INFO ][plugins                  ] [The Wink] loaded [], sites []
[2012-12-28 04:15:39,716][INFO ][node                     ] [The Wink] {0.20.2}[22685]: initialized
[2012-12-28 04:15:39,717][INFO ][node                     ] [The Wink] {0.20.2}[22685]: starting ...

こんなかんじになれば成功です!簡単ですね!

データを入力してみる

elasticsearchはREST APIでやりとりするので、検索用データの保存もAPI経由で行います。
登録するときはこんな感じで行います。PUTメソッドでJSONデータを送ります。

$ curl -XPUT http://localhost:9200/foo/bar/1 -d '
{
  "user"  : "wadap",
  "email" : "me@wadap.jp",
  "body"  : "foobar"
}'

JSONでデータ構造を表現するので、すごくわかりやすいと思います。

上記のfooに当たる部分をindex、barにあたる部分をtypeと呼びます。
MySQLに直すと、それぞれfooがdatabase、barがtableといった感じでしょうか。
# 実際のところはMySQLよりももっと柔軟に検索ができるのであくまでイメージです。

データを検索する

それでは入力したデータを検索してみましょう。_searchというメソッドを使います。

$ curl -XGET http://localhost:9200/foo/bar/_search -d'
{
  "query":
    {
      "match":{"user":"wadap"}
    }
}'
{"took":10,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.30685282,"hits":[{"_index":"foo","_type":"bar","_id":"1","_score":0.30685282, "_source" : 
{
  "user"  : "wadap",
  "email" : "me@wadap.jp",
  "body"  : "foobar"
}}]}}

こんな感じで返ってくれば成功です!

今回は1件だけでしたが、件数を指定する場合はsizeというパラメータを利用します。こんなかんじになります。

$ curl -XGET http://localhost:9200/foo/bar/_search -d'
{
  "size" : 10,
  "query":
    {
      "match":{"user":"wadap"}
    }
}'

ページングで使いがちなデータを取得する位置を指定するには、fromというパラメータを利用します。

$ curl -XGET http://localhost:9200/foo/bar/_search -d'
{
  "size" : 10,
  "from" : 5,
  "query":
    {
      "match":{"user":"wadap"}
    }
}'

日本語対応は?

GitHub - suguru/elasticsearch-analysis-japanese: Japanese analyzer uses kuromoji japanese tokenizer for ElasticSearch
作ってくれた方がいらっしゃるようですね!(まだちゃんと試していません)pluginコマンドで簡単にインストールすることができます。

さいごに

まだまだたくさん機能はあります!nanapiの次世代検索エンジンの可能性も含めて今後も引き続きいろいろと試していこうと思います。
nanapiでは検索エンジン好きのエンジニアを募集しています!