ページ

2016年2月27日土曜日

Elasticsearchを学ぶ 3 - Mapping -



今回はデータをElasticSearchにインポートする際に、どのデータがどの項目に入るか?
そのデータは数値か?日付か?などなど、データインポートする際に必要な
Mapping作業を行ってみたいと思います。

  • 環境
引き続き前回の環境を前提に進めていきたいと思います。

Mapping用のJSONファイル作成


MySQLなどで言うところのテーブルCreate用のSQLを作成するような感じだと思います。
  • 用語
Mapping Types
Index内のTypeを定義するもの。
メタ要素として_index_type_id_sourceがある。
またMappingTypes内にはフィールドとしてPropertiesを持つ。

Field datatypes
フィールドのデータタイプを定義する。
主要なものとしてstringdatelongdoublebooleanipなどがある。
JSONのフォーマットで階層を用いてobjectnestedというデータタイプもあるらしい。

サンプルとして公式ページを参考にシンプルなMappingを作成してみます。
{
  "mappings": {
    "user": { *1
      "properties": { *2
        "name":     { "type": "string"  }, *3
        "age":      { "type": "integer" }  
      }
    },
    "book": {
      "properties": {
        "title":    { "type": "string"  },
        "description":     { "type": "string"  },
        "user_id":  {
          "type":   "string",
          "index":  "not_analyzed"
        },
        "created":  {
          "type":   "date",
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}
一応ユーザーと、そのユーザーが所有する書籍というイメージで作成してみました^^;
*1MappingType*2がフィールド、*3がフィールドとデータタイプになります

試しにこれをuser_booksというIndexに適用させてみたいと思います。
↑のJSONファイルをmapping.jsonとして保存し、保存した場所で以下コマンド実行。
$ curl -X POST 192.168.33.180:9200/user_books -d @mapping.json
{"acknowledged":true}が返って来れば成功

早速 http://192.168.33.180:9200/_plugin/head/ にアクセスして確認してみます。
ちゃんとuser_booksというIndexが作成されていれば成功です。

テストデータ投入


試しに1件userのTypeのid=1にデータを投入してみます。
$ curl -X PUT 192.168.33.180:9200/user_books/user/1 -d '{
  "name" : "hoge",
  "age" : 20
}'
以下のようなレスポンスがあれば成功です。
{
  "_index":"user_books",
  "_type":"user",
  "_id":"1",
  "_version":1,
  "_shards":
  {
    "total":2,
    "successful":1,
    "failed":0
  },
  "created":true
}
ちゃんと登録されているか確認します。
ちゃんと登録されてますね。
今回はここまで。

2016年2月25日木曜日

おすすめの書籍紹介4 - 人工知能/その他 -


私事ですが最近はなかなかのハードな日々を過ごしております(> o <)
毎日眠たくてしょうがないです(笑)

そんな忙しい時はなかなか本を読んで勉強という機会がなくなってしまうのですが、
今回紹介する本はそんな忙しい時でも手軽に読める本かなと思います。

※プログラミング書籍は一切出てきません^^;


・ 人工知能


・人工知能は人間を超えるか ディープラーニングの先にあるもの



タイトルからして難しそう!! と思うかもしれませんが
読んだら意外に楽しく読めます。

自分にとっては未知の分野ですが、面白そうだったので、買ってみました。
世間が思う人工知能と、現時点の人工知能の技術とのズレが書かれていたり、
今までの人工知能の歴史、第一次AIブームから、機械学習、ディープラーニングなど
結構リアルな内容だな〜と思いました。

そしてディープラーニングはすごいブレイクスルーだったんだなと。。。
興味がある方は是非^^




・ その他


・なぜあの人は、夜中にラーメンを食べても太らないのか?


タイトルにつられてまんまと買ってしまいました(笑)
最近は帰りが遅く、夜中に食事をとる生活なのでちょっと
気をつけようと購入してみました。

この本を読んで現在はとにかくサラダを沢山食べるようにしてます。
メインの食事の前に沢山サラダを食べるとその後の食事が
少しで済むようになったので良かったかなと思ってます。


いつもがっつり技術ネタなので、今回はゆる〜い感じで書いてみました。
あと逆におすすめの本があったら是非教えてくださいw

2016年2月21日日曜日

Elasticsearchを学ぶ 2 - Plugin ElasticSearch Head -


今回はElasticsearchの便利なプラグインElasticSearch Headを使ってみたいと思います。

  • 環境
ここでは前回の環境を前提に進めていきたいと思います。
前回のVagrantファイルの設定は
config.vm.network "forwarded_port", guest: 9200, host: 9200
config.vm.network "private_network", ip: "192.168.33.180"
になっています。

※ここで使用しているElasticsearchのバージョンは2.xです。
1.xとコマンドが若干違います。

ElasticSearch Head


Elasticsearchをブラウザで操作、閲覧できるようにするプラグインです。
公式ページはこちら
  • インストール
$ cd elasticsearch
$ bin/plugin install mobz/elasticsearch-head
  • 外部からアクセスできるようにする
※今回はiptablesを無効化します(本当はちゃんと設定しないとですが^^;)
$ sudo service iptables stop
ブラウザからhttp://192.168.33.180:9200/_plugin/head/ にアクセス

↑のような画面が出ればOK
  • 使い方
タブ概用
Overview横にIndex、縦にNodeを表示
↑の画面では1つのNodeが4つのShardsでIndexのbank構成
※Unssaignedはとりあえず無視(- -;)
IndicesIndexの一覧
BrowserIndexのデータをブラウズできる
Structured QueryQueryを構築でき、どんなJSONになるか確認出来る
Any QueryRequest Methodを投げることができる
  • Browser

Documentをクリックすると詳細が表示されます

  • Structured Query
↑ではaccount_numberが20のものを表示させています
クエリーのJSONが確認出来るので便利です。

  • Any Query

軽く使ってみて


一回一回curlでやらなくてもGUIで出来るのはやっぱり便利だなと思います^^;
ただ頼り過ぎるとコマンドを忘れそう・・

2016年2月18日木曜日

Elasticsearchを学ぶ1 - 概要 -


前回サクッと触れてみましたが、 今回じっくり触ってみたいと思います。
※環境は前回の環境を使用します。

概用


Elasticsearchのデータ構造を公式のドキュメントを読んで自分なりにまとめてみました
※間違っていたら教えて頂けると助かります。
  • Cluster
    ・・・1つかそれ以上のNodeを持ち、複数のNodeをまたいで検索できる
    クラスタにはユニークな名前をつける必要がある
  • Node
    ・・・クラスタ内の要素、デフォルトの名前はMarvelのキャラクターの名前が付けられる
  • Index
    ・・・データの集合、集合の特徴を表す名前にする。例) customer, product
  • Type
    ・・・マッピングタイプ。Index内の要素でデータのタグみたいなもの
  • Document
    ・・・最小単位のデータ。DocumentのデータがJSON形式で表現される
  • Shards
    ・・・一つのIndexに膨大なデータを登録する際などに、細分化する仕組み
    実際はLuceneのインスタンス
図にするとこんな感じのイメージです。

サンプルデータ投入


公式ページにサンプルの顧客データが用意されているので、それを使おうと思います。
※公式ページのサンプルデータと同じリンクを貼っときます here
早速ダウンロードしたaccounts.jsonを登録してみたいと思います。
accounts.jsonと同じディレクトリで以下コマンドを実行。
$ curl -XPOST localhost:9200/bank/account/_bulk?pretty' --data-binary "@accounts.json"
↑のコマンドではIndexがbank、Typeがaccountにデータを登録します
  • 実際に登録できたか確認
$ curl localhost:9200/_cat/indices?v'health status index pri rep docs.count docs.deleted store.size pri.store.size
yellow open   bank    5   1       1000            0    442.1kb        442.1kb
docs.countを見ると1000件のDocumentが登録されているのがわかります。

検索してみる


単純にaccount_numberが20のアカウントを検索してみます。
$ curl -XPOST localhost:9200/bank/_search?pretty' -d '{
  "query": { "match": { "account_number": 20 } }
}'
検索時にはQueryDSLを使って検索します。
成功すれば以下のレスポンスが返ってくると思います。
{
  "took" : 20,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 5.6587105,
    "hits" : [ {
      "_index" : "bank",
      "_type" : "account",
      "_id" : "20",
      "_score" : 5.6587105,
      "_source" : {
        "account_number" : 20,
        "balance" : 16418,
        "firstname" : "Elinor",
        "lastname" : "Ratliff",
        "age" : 36,
        "gender" : "M",
        "address" : "282 Kings Place",
        "employer" : "Scentric",
        "email" : "elinorratliff@scentric.com",
        "city" : "Ribera",
        "state" : "WA"
      }
    } ]
  }
}
それぞれのパラメータの意味は・・
  • took - Elasticsearchが検索にかかった時間(ms)
  • timed_out - タイムアウトしたかどうかの真偽値
  • _shards 検索するのにどれだけのShardsを使用したか
  • hits 検索結果
  • hits.total 検索Document
  • hits.hits 検索結果の配列(デフォルトでは先頭の10件表示)

2016年2月14日日曜日

新しい技術を学んでみる 6 - Elasticsearch -


Elasticsearch
AWSのサービスと勘違いしそうな名前ですが、、、
※すでにAmazon Elasticsearch ServiceというElasticsearchを使った
サービスがあるんでさらにややこしい・・・
そんなElasticsearchを学んでいきたいと思います。
Elasticsearchとは?
Luceneという全文検索エンジンを利用しているElastic社の元でOSSとして開発されてるサービス
・・・Lucene?,全文検索エンジン?
調べてみました。
全文検索エンジンとは?
wikipediaによると・・・
全文検索(ぜんぶんけんさく、Full text search)とは、
コンピュータにおいて、複数の文書(ファイル)から特定の文字列を検索すること。
「ファイル名検索」や「単一ファイル内の文字列検索」と異なり、
「複数文書にまたがって、文書に含まれる全文を対象とした検索」という意味で使用される。
とあります。
Luceneとは?
こちらもwikipediaによると・・・
Javaで記述された全文検索ソフトウェア、Javaのクラスライブラリとして提供される。
1000万ドキュメントくらいの規模まで1台のマシンで対応できる。
このLuceneを使ったものとして、大きく分けると
があるとのこと。

とりあえず触ってみる


実際に使って雰囲気を掴んでみたいと思います。
今回もVagrantitamaecentosに環境を構築してみたいと思います。
$ vagrant init
$ bundle init
VagrantファイルとGemfileを以下に編集
  • Vagrantに以下行を追加
config.vm.network "forwarded_port", guest: 9200, host: 9200
config.vm.network "private_network", ip: "192.168.33.180"
  • Gemfileに以下行を追加
gem "itamae"
gem "dotenv"
まずはvagrantを起動
$ vagrant up
itamaeのレシピとしてmain.rbを作成
# coding: utf-8
require 'dotenv'

Dotenv.load

%w(yum wget java-1.8.0-openjdk).each do |pkg|
  package pkg do
    action :install
  end
end

puts "version : #{ENV['EVARSION']}"
execute 'elasticsearch download' do
  command "wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/#{ENV['EVARSION']}/elasticsearch-#{ENV['EVARSION']}.tar.gz -O elasticsearch.tar.gz"
end

execute 'elasticsearch.tar.gz unzip' do
  command 'tar -zxf elasticsearch.tar.gz'
end

puts "install path : #{ENV['INSTALL_PATH']}"
execute "sudo mv elasticsearch-#{ENV['EVARSION']} #{ENV['INSTALL_PATH']}" do
  not_if "ls #{ENV['INSTALL_PATH']}"
end

execute "sudo chmod -R 755 #{ENV['INSTALL_PATH']}" do
  only_if "ls #{ENV['INSTALL_PATH']}"
end

execute "sudo chown -R #{ENV['EUSER']}:#{ENV['EUSER']} #{ENV['INSTALL_PATH']}" do
  only_if "ls #{ENV['INSTALL_PATH']}"
end
.envを作成
EVARSION=2.2.0
INSTALL_PATH=/usr/local/share/elasticsearch
EUSER=vagrant
バージョンやインストール先などは置き換えて下さい
実行してみます。
$ bundle exec itamae ssh --vagrant main.rb
エラーが出た場合は.envの設定を見直してみて下さい
  • Elasticsearch設定
$ vagrant ssh
$ cd /usr/local/share/elasticsearch
$ vi config/elasticsearch.yml
$ diff config/elasticsearch.yml  config/elasticsearch.yml.org
58c58
< http.port: 9200
---
> # http.port: 9200
  • 起動
$ /usr/local/share/elasticsearch/bin/elasticsearch -d -p pid
  • 確認
$ curl -X GET http://localhost:9200/
{
  "name" : "D'Ken",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.2.0",
    "build_hash" : "8ff36d139e16f8720f2947ef62c8167a888992fe",
    "build_timestamp" : "2016-01-27T13:32:39Z",
    "build_snapshot" : false,
    "lucene_version" : "5.4.1"
  },
  "tagline" : "You Know, for Search"
}
上のように表示されればOK
  • 停止
$ kill `cat pid`
  • 触ってみて
インストールが簡単でRestfull APIで〜となると扱いやすいですね。
最近人気なのもわかる気がします。^^;
今回はここまで。