大量の文書を登録して検索する
検索エンジン作成するにあたって大量の文書を登録する処理が必須となってきます。
Elasticsearchには大量の文書を登録するための処理が用意されています。BulkというAPIを使用すれば高速に大量の文書の登録や削除が可能になります。JSON形式のファイルの登録が可能であり、それを圧縮した形式でも登録可能な点が強力です。
今回はJSON形式の登録用のファイルを用意して、それをbulk処理で登録するシェルスクリプトを用意しました。
用意したデータは下記です。2行ごとの構成になっており、1行目がどこに文書を登録するか、文書のタイプは何か、登録する際のIDは何かを指定しています。2行目で登録する文書の内容を実際に記述する形となっています。
{ "index" : { "_index" : "contents-2016", "_type" : "contents", "_id" : "2" } } { "body_text": "今回、作成したUbuntuでのDocker環境の構築方法です。他のディストリビューションやバージョンを試したい方は下記をご参照ください。"} 略
用意したデータを下記のスクリプトで登録します。
#!/bin/bash 略 # -- Body --------------------------------------------------------- # SCRIPT LOGIC GOES HERE # Regist json bulk curl -XPOST http://localhost:9200/_bulk --data-binary \ "@data/test_bulk_article.json" > /dev/null sleep 10s # Check the regist data curl 'localhost:9200/_cat/indices?v' # -----------------------------------------------------------------
下記で実行します。
sh shell/elastic_regist_search_json.sh
上記のスクリプトを実行した結果が下記です。分かりづらいのですが、登録されている文書が5に増えており、Bulk処理で用意したJSONのファイルを保存していることが分かります。
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1772 100 596 100 1176 15433 30452 --:--:-- --:--:-- --:--:-- 30947 health status index pri rep docs.count docs.deleted store.size pri.store.size green open contents-20160111 1 0 5 0 8kb 8kb
新たに登録した文書が検索できるか確かめてみます。
curl -XGET 'localhost:9200/contents-20160111/contents/_search?pretty' -d' { "query":{"match":{"body_text":"大量にある文書"}} }'
下記が検索結果です。新たに登録した文書が検索可能になっていることが分かります。
{ "took" : 11, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.70825994, "hits" : [ { "_index" : "contents-20160111", "_type" : "contents", "_id" : "3", "_score" : 0.70825994, "_source" : { "body_text" : "Elastic社の元でOSSとして開発されてる大量にある文書の中から目的のワードを持つ文書を検索するための検索エンジンのことです。" } } ] } }
最後に
以上でElasticsearchを用いた日本語検索システムの紹介を終わります。作業は多いですが簡単に全文検索システムを作れるのは非常に魅力的です。この記事をきっかけに多くの方がElasticsearchを利用していただけるようになると幸いです。
次回はスコアリングを改良して検索結果をチューニングするための手法を紹介します。