Riak searchを使ってみた
はじめに
Riakで全文検索してみたいと思い、Riakのsearch機能を利用する準備で行った作業をまとめました。
利用環境
- Ubuntu server 14.04
- Riakのホストは192.168.56.101
- Riak 2.0.5(from source)
前準備
- ビルドしたriakの設定ファイルetc/riak.confの"search = off"を"search = on"に書き換える
- basho/riak-erlang-client · GitHub
作業
indexの作成
例として、"api_index"という名前のindexを作成します。
export RIAK_HOST="http://192.168.56.101:8098" curl -XPUT $RIAK_HOST/search/index/api_index \ -H 'Content-Type: application/json' \ -d '{"schema":"_yz_default"}'
下記、URLにアクセスし、api_indexのsolrのcore(?)が作成されているか確認します。 ※ solrについて詳しくないので上記言い回し的に間違ってたらご指摘ください。
http://192.168.56.101:8093/internal_solr/
Bucket typeの作成
(riakdb)$ riak-admin bucket-type create api_type '{"props":{}}' zone_type created (riakdb)$ riak-admin bucket-type activate api_type zone_type has been activated
注意:上記コマンドを実行した時に、バージョンを2.0以下ダウングレードすると利用できなくなりますというWARNINGが出ますが、問題なくBucket typeは作成されます。
indexing
作成したBucket typeに対してindex "api_index"を設定します。
curl -XPUT http://192.168.56.101:8098/types/api_type/buckets/Zone/props \ -H 'Content-Type: application/json' \ -d '{"props": {"search_index":"api_index"}}'
検索の確認
Json形式でZoneのデータを格納し、検索してみます。 今回は、Erlangシェル上で格納、検索を実行します。
{ok, Conn} = riakc_pb_socket:start_link("192.168.56.101",8087). Json = <<"{\"name_s\":\"テストゾーン\",\"description_s\":\"テストゾーンの説明です。ニュース、スポーツ、ドラマ、アニメ、テスト、政治、経済、映画、恋愛\"}"/utf8>>. riakc_pb_socket:put(Conn, {<<"api_type">>, <<"Zone">>}, Json). riakc_pb_socket:search(Conn, <<"api_index">>, <<"description_s:*経済*"/utf8>>).
おまけ
indexを削除する方法も載せておきます。 curlで一度、Bucketに関連付けされているindexを削除します。 削除には、search_indexにdont_indexを指定します。
curl -XPUT http://192.168.56.101:8098/types/api_type/buckets/Zone/props \ -H 'Content-Type: application/json' \ -d '{"props":{"search_index":"_dont_index_"}}'
次に、api_indexのindexを削除します。
curl -XDELETE $RIAK_HOST/search/index/api_index
下記で"api_index"のcoreが削除されているのを確認できます(多少時間が経過しないと反映されません)。
http://192.168.56.101:8093/internal_solr/
あとがき
Riak searchを使うためにやったことを忘れないよう書きました。 扱うデータが今回JSONでしたが、他にもXMLだとか、いろいろ扱えます。特に、Riak Data Typesといったものがあるらしく、気になるので次はそのデータ型を試して見ようかと思ってます。 いくつかタイプがあるのですが、map型が色々出来そうなので遊んでみます。