GW最終日
今年のGWは何もすることができなかった。正確に言えば動けなかったとも言えるだろう。なぜならお金が無いからだ。就職活動がためにとんでしまったのである。普通なら大型連休だし欲望のまあ消費活動に勤しみたいところであったが資金がなかった。そもそもGWって遊ぶための連休なのか?学生の本業は勉学ではないか?と自問自答や屁理屈を言った結果最終日もお勉強することに
今日は研究で今後必要だろうElasticSearchについて勉強していく。
ElasticSearchとは
ElasticSearchは全文検索エンジンであるらしい。 全文検索について知らない私はその意味を調べると、
「複数の文書から特定の文字列を検索すること」
らしい。
とりあえずさわってみる
ElasticSearch2.3.2をzipでダウンロードしてくる
$ wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/zip/elasticsearch/2.3.2/elasticsearch-2.3.2.zip $ unzip elasticsearch-2.3.2.zip $ cd elasticsearch-2.3.2 $ bin/elasticsearch & $ curl -X GET http://localhost:9200
とサイトに書いてあるインストールステップ律儀にこなす
{ "name" : "Antiphon the Overseer", "cluster_name" : "elasticsearch", "version" : { "number" : "2.3.2", "build_hash" : "b9e4a6acad4008027e4038f6abed7f7dba346f94", "build_timestamp" : "2016-04-21T16:03:47Z", "build_snapshot" : false, "lucene_version" : "5.5.0" }, "tagline" : "You Know, for Search" }
nameのところの値はにはマーベルのキャラクタの名前をランダムで当てているらしい。ちなみに"Antiphon the Overseer"というのは彼らしい
公式のドキュメントには僕みたいな初心者のためにある銀行の顧客データを模したサンプルのデータセットが用意されている。今回はそれを使う。
まずデータセットをローディングしていく。
$ curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary "@accounts.json" $ curl 'localhost:9200/_cat/indices?v' health index pri rep docs.count docs.deleted store.size pri.store.size yellow bank 5 1 1000 0 424.4kb 424.4kb
どうやらできてるっぽい!
Node.js + ElasticSearchで簡単な検索サービスを作る
つい昨日Expressに入門した私は検索エンジン的なものが作れるのではないかと考えやってみることにした。
まずはviwes/index.ejsである。
<!DOCTYPE html> <body> <h1>ES bank Query Test!.</h1> <form method="post" action="/"> <table> <tr> <td><p>query</p></td> <td><input type="text" name="input1" value="<%= query %>"></td> </tr> <tr> <td>fields</td> <td><input type="text" name="input2" value="<%= fields %>"></td> </tr> </table> <input type="submit"> </form> <br><br> <div> <%= content %> </div> </body>
次にapp.jsを書いていく。
var express = require('express'); var ejs = require('ejs'); var bodyParser = require('body-parser'); var elasticsearch = require('elasticsearch'); var client = elasticsearch.Client({ host: 'localhost:9200' }); var app = express(); app.use(bodyParser.urlencoded({extended: false})); app.use(bodyParser.json()); app.engine('ejs', ejs.renderFile); app.get('/', function(req, res){ res.render('index.ejs', { query: '', fields: '', content: '' }); }); app.post('/', function(req, res){ client.search({ index: 'bank', type: 'account', body: { query: { multi_match: { query: req.body['input1'], fields: req.body['input2'].split(',') } } } }).then(function(response){ var hits = response.hits.hits; var str = JSON.stringify(hits); console.log(hits); res.render('index.ejs', { query: req.body['input1'], fields: req.body['input2'], content: str }); }, function(error){ console.trace(error.message); }); }); app.listen(3000);
Nodejsのモジュールでelasticsearchという便利なものがあるのでそれを使いElasticSearchにクエリを流す。elasticsearchはnpmで普通にinstallできる。
これが実行結果である。
今回はさわってみただけでElasticSearchの構造や仕組みについて触れていないが大体イメージをつかむことができた。構造や仕組みについてもこれから勉強するつもりなのでまとまったらまたブログにまとめてみたい。
p.s.
この記事を書いてる途中でネットが切れてしまい記事全部ふっとびました。みなさんもお気をつけ下さい。