ngtokuの日記

主に雑記帳です。SNSではngtokuのID取れなかったんで、別のIDでやってます。

pandasでexcel取り込んでプロット

作業ログ的に記録。
作業はAnaconda上のNotebookで。

データは以下を使用。
CO2 emissions (metric tons per capita) | Data

上記excelの "Data" シートの内容を取り込んでプロット。
全行だと多すぎるので、とりあえず2-10行目を出力。

import pandas as pd
import numpy as np
book = "/(ファイルパス)/API_EN.ATM.CO2E.PC_DS2_en_excel_v2_10134430.xls"
sheet="Data"
excel = pd.ExcelFile(book)
df = excel.parse(sheet, skiprows=3) # 上3行を飛ばして4行目から取り込み
df = df.iloc[:, np.r_[1, 4 : 59]] # 1960-2014
df = df.dropna() # NaNの含まれる行を削除
df = df[2:10] # 2行目から10行目まで
df = df.set_index("Country Code") # インデックス値を"Country Code" の列に指定
df.T.plot() # 行列を入れ替えてプロット

グラフはこうなった。
f:id:ngtoku:20181008012523p:plain

コメント入れたので特に説明は不要だろう。

RHEL7.5 上でPython3.6動かす

作業メモ。
anaconda使わないでmod_wsgi経由のDjango起動まで。

RHELAWSにある既存のやつ(↓)から、インスタンスタイプはt2.microで。
RHEL-7.5_HVM_GA-20180322-x86_64-1-Hourly2-GP2 (ami-6871a115)

基本これベース
https://it-engineer-lab.com/archives/161

1.タイムゾーン変更

$ sudo timedatectl set-timezone Asia/Tokyo

2.Pythonインストール

以下より
https://www.unixarena.com/2018/05/how-to-install-python-3-on-redhat-enterprise-linux-7-x.html/

RHELなのにcentos7.iuscommunityだったのでちょっと確認したけどこれでいいらしい。
インストール後、ls したり echoしたりして確認。

$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-$(rpm -E '%{rhel}').noarch.rpm
$ sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
$ sudo yum install -y python36u python36u-pip
$ ls -ltr /usr/bin/python*
$ echo $PATH


python -V の結果がver2.7.5だったので再起動かログインし直して再確認、ちゃんとver3.6になってた。
シンボリックリンク変更してしまうとyumが動かなくなるので注意。

3.pipとDjangoインストール

当然ながら、ポート8080を解放しておかないとブラウザで確認できないぞ。

$ sudo /usr/local/bin/pip install --upgrade pip
$ sudo /usr/local/bin/pip install django
$ django-admin startproject mysite
$ cd mysite/
$ python manage.py runserver 0.0.0.0:8080


この状態でブラウザアクセスすると「ALLOWED_HOSTS直しなさい」って言われるので、
vi mysite/settings.py して ALLOWED_HOSTS を編集。
そのごrunserverしなおすと例のロケット画面表示。

4.Apacheとmod_wsgiインストール

Apacheのバージョンは2.4だった。

$ sudo yum install -y httpd httpd-devel
$ sudo systemctl enable httpd.service
$  sudo /sbin/service httpd start


以下エラーが出たので、develをインストール
src/server/wsgi_python.h:24:20: 致命的エラー: Python.h: そのようなファイルやディレクトリはありません

$ sudo yum install -y python36u-devel
$ sudo pip install mod_wsgi


以下でライブラリのフルパスを取得

$ sudo find / -name '*wsgi*.so'


依存関係確認。あったら対処。今回はなかったので作業なし。

$ ldd /usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so


mod_wsgi設定

$ sudo vi /etc/httpd/conf.modules.d/mod_wsgi.conf


内容は以下。各自のプロジェクトのパスに応じて適宜書き替えてること。

LoadModule wsgi_module /usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so


django設定

$ sudo vi /etc/httpd/conf.d/django.conf


内容は以下。WSGIPythonHomeは使わなかったのでコメント。ググった感じみんなvirtualenvつかってるが、今回は使用しない。
各自のプロジェクトのパスに応じて適宜書き替えること。

WSGIScriptAlias / /home/ec2-user/mysite/mysite/wsgi.py
#WSGIPythonHome /usr/lib64/python3.6/
WSGIPythonPath /home/ec2-user/mysite:/usr/lib64/python3.6/site-packages

<Directory /home/ec2-user/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

# 以下がないとDjangoチュートリアルのcssファイルが参照できない。ていうか何もしないとhtmlタグつけられるのでcssとして機能しない
Alias /static/ /home/ec2-user/mysite/static/
<Directory /home/ec2-user/mysite/static>
Require all granted
</Directory>


/etc/httpd/conf.d/django.confの設定に合わせて、サンプルのスタイルシートをコピー。

$ cp -rp /usr/lib64/python3.6/site-packages/django/contrib/admin/static/ /home/ec2-user/mysite/


SELINUXをOFFにしないと ModuleNotFoundError: No module named 'encodings' とかpermission denied とかでる。

$ vi /etc/selinux/config


SELINUX=enforcing ⇨ SELINUX=disabled


Apache起動して、ポート80で確認。OK!
うまくいかなかったらerror_log確認。当然ながらポート80開けてないと見れないぞ。

$ sudo /sbin/service httpd restart
$ sudo less /var/log/httpd/error_log


本当に作業するならLet's Encrypt入れてHTTPS化しないとね。

MQの簡単ヘルスチェック(リモート)

前回はMQサーバと同じマシンでチェックしていたので、今回はクライアントからリモートで接続。
手順は以下参照。
https://www.ibm.com/support/knowledgecenter/ja/SSFKSJ_9.0.0/com.ibm.mq.explorer.doc/bi00260_.htm

1.クライアント側で環境変数セット

シェルはbash。念のため。

# MQSERVER="チャネル名/TCP/MQサーバのホスト名(MQのポート番号)"
# export MQSERVER

2.クライアント側で動作確認

以下でいけた。前回とコマンドがちょっとだけ違うので注意。多分clientのc。

# /opt/mqm/samp/bin/amqsputc キュー名
# /opt/mqm/samp/bin/amqsbcgc キュー名
# /opt/mqm/samp/bin/amqsgetc キュー名

某社の環境でも稼動確認done。
なお、MQのCCSIDの設定によっては、クライアントのlocaleが設定されていない場合は接続に失敗するので、CCSIDに合わせたlocaleを設定すること。

MQの簡単ヘルスチェック(ローカル)

某社でMQ担当の設定やオペレーションのミスがあまりにも多くて「設定後やサーバの再起動後にヘルスチェックやってないの?」と聞いてみたら「MQにそんな手段は存在しない。プログラムの側で確認して貰うしかない。」と返してきたので「本当かいな?」と思い確認してみた時の記録。
1〜2は環境構築なので、実際に行う手順は3のみ。4は異常時の確認。

1.IBMのDockerイメージから環境構築

作業環境にdockerが入っていないかったので、そこから。

# yum -y install docker-io
# service docker start
# git clone https://github.com/ibm-messaging/mq-docker

ただそのままだと確認用プログラム(MQSeriesSamples)とリモート確認用ライブラリ(MQSeriesClient)が入っていないので、Dockerfile編集。

# cd mq-docker
# vi server/Dockerfile

変更前
ARG MQ_PACKAGES="MQSeriesRuntime-*.rpm MQSeriesServer-*.rpm MQSeriesMsg*.rpm MQSeriesJava*.rpm MQSeriesJRE*.rpm MQSeriesGSKit*.rpm"
変更後
ARG MQ_PACKAGES="MQSeriesRuntime-*.rpm MQSeriesServer-*.rpm MQSeriesMsg*.rpm MQSeriesJava*.rpm MQSeriesJRE*.rpm MQSeriesGSKit*.rpm MQSeriesSamples*.rpm MQSeriesClient*.rpm"

# docker build --tag mq ./server/
# docker run --env LICENSE=accept --env MQ_QMGR_NAME=QM1 --volume /var/example:/var/mqm --publish 1414:1414 --detach mq
# docker ps
# docker exec -it コンテナのID /bin/bash

2.キュー作成

https://github.com/ibm-messaging/mq-docker の手順そのままで起動したのでMQ1というキューマネージャがあるが、それはそれとして別に作る。
以下はコンテナ内でのコマンドである。念のため。

2.1 キュー・マネージャー作成

以下からコピペ。
https://www.ibm.com/support/knowledgecenter/ja/SSFKSJ_9.0.0/com.ibm.mq.explorer.doc/bi00237_.htm

# crtmqm QM_ORANGE
# strmqm QM_ORANGE
2.2 キュー作成

以下からコピペ。
https://www.ibm.com/support/knowledgecenter/ja/SSFKSJ_9.0.0/com.ibm.mq.explorer.doc/bi00238_.htm

# runmqsc QM_ORANGE
	5724-H72 (C) Copyright IBM Corp. 1994, 2016.
	Starting MQSC for queue manager QM_ORANGE.
	define qlocal (QM_APPLE) usage (xmitq)
	     1 : define qlocal (QM_APPLE) usage (xmitq)
		AMQ8006: IBM MQ queue created.
	define qremote (Q1) rname (Q1) rqmname(QM_APPLE) xmitq (QM_APPLE)
	     2 : define qremote (Q1) rname (Q1) rqmname(QM_APPLE) xmitq (QM_APPLE)
		AMQ8006: IBM MQ queue created.
2.3 メッセージ・チャネル作成、リスナー起動

以下からコピペ。2.2からの続きで "runmqsc QM_ORANGE" 実行中なので注意。
https://www.ibm.com/support/knowledgecenter/ja/SSFKSJ_9.0.0/com.ibm.mq.explorer.doc/bi00239_.htm

	define channel (QM_ORANGE.QM_APPLE) chltype (RCVR) trptype (TCP)
	     3 : define channel (QM_ORANGE.QM_APPLE) chltype (RCVR) trptype (TCP)
		AMQ8014: IBM MQ channel created.
	alter listener(system.default.listener.tcp) trptype(tcp) port(1414)
	     4 : alter listener(system.default.listener.tcp) trptype(tcp) port(1414)
		AMQ8623: IBM MQ listener changed.
	start listener(system.default.listener.tcp)
	     5 : start listener(system.default.listener.tcp)
		AMQ8021: Request to start IBM MQ listener accepted.
	end
     	6 : end

3.サンプルプログラムで動作確認

MQに付帯しているサンプルプログラムを実行することで、キューマネージャ、リスナーが起動しているか確認。

3.1 PUT

とりあえず"UNKO"ってメッセージ入れてみた。リターンキーを二回打つとリクエストを終了させる。

# /opt/mqm/samp/bin/amqsput QM_APPLE QM_ORANGE
	Sample AMQSPUT0 start
	target queue is QM_APPLE
	UNKO
	Sample AMQSPUT0 end
3.2 キューの中身確認

入ってますな。

# /opt/mqm/samp/bin/amqsbcg QM_APPLE QM_ORANGE

	AMQSBCG0 - starts here
	**********************

	 MQOPEN - 'QM_APPLE'


	 MQGET of message number 1, CompCode:0 Reason:0
	****Message descriptor****

	  StrucId  : 'MD  '  Version : 2
	  Report   : 0  MsgType : 8
	  Expiry   : -1  Feedback : 0
	  Encoding : 546  CodedCharSetId : 819
	  Format : 'MQSTR   '
	  Priority : 0  Persistence : 0
	  MsgId : X'414D5120514D5F4F52414E47452020205AF1C458BEB37F25'
	  CorrelId : X'000000000000000000000000000000000000000000000000'
	  BackoutCount : 0
	  ReplyToQ       : '                                                '
	  ReplyToQMgr    : 'QM_ORANGE                                       '
	  ** Identity Context
	  UserIdentifier : 'root        '
	  AccountingToken :
	   X'0130000000000000000000000000000000000000000000000000000000000006'
	  ApplIdentityData : '                                '
	  ** Origin Context
	  PutApplType    : '6'
	  PutApplName    : 'amqsput                     '
	  PutDate  : '20170312'    PutTime  : '07110730'
	  ApplOriginData : '    '

	  GroupId : X'000000000000000000000000000000000000000000000000'
	  MsgSeqNumber   : '1'
	  Offset         : '0'
	  MsgFlags       : '0'
	  OriginalLength : '-1'

	****   Message      ****

	 length - 4 of 4 bytes

	00000000:  554E 4B4F                               'UNKO            '



	 No more messages
	 MQCLOSE
	 MQDISC
3.3 GET

取れてますな。15秒ほど待つとタイムアウトで接続が切れる。

# /opt/mqm/samp/bin/amqsget QM_APPLE QM_ORANGE
	Sample AMQSGET0 start
	message <UNKO>
	no more messages
3.4 もう一度キューの中身確認

GETで取得したので、残ってませんな。

# /opt/mqm/samp/bin/amqsbcg QM_APPLE QM_ORANGE
	AMQSBCG0 - starts here
	**********************
	
	 MQOPEN - 'QM_APPLE'
	
	
	
	No more messages
	MQCLOSE
	MQDISC

4.異常時

4.1 キュー・マネージャーを落としてみる
# endmqm QM_ORANGE
	Quiesce request accepted. The queue manager will stop when all outstanding work is complete.
# dspmq
	QMNAME(QM1)                                               STATUS(Running)
	QMNAME(QM_ORANGE)                                         STATUS(Ended normally)
4.2確認してみる。

接続エラー出た。

# /opt/mqm/samp/bin/amqsbcg QM_APPLE QM_ORANGE
	AMQSBCG0 - starts here
	**********************
	MQCONNX failed with CompCode:2, Reason:2059
4.3 エラーコード確認

上で出たエラーコード 2059を確認。キュー・マネージャーが落ちていることが確認できる。

# /opt/mqm/bin/mqrc 2059
	2059  0x0000080b  MQRC_Q_MGR_NOT_AVAILABLE

アプリ側に頼らなくとも、MQの付属品で十分確認出来ますな。
以上。

Groonga 6.1.2 on CentOS 7.3

引き続き、ちょっと気になったので少しだけ触ってみた。
手順は以下。
1.Groongaインストール
2.軽く検証

1.Groongaインストール
  これだけ。Elasticsearchは色々入れたけど、こっちはちょっと触るぶんにはこれだけで良さげ。

# rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
# yum makecache
# yum install -y groonga
# yum install -y groonga-tokenizer-mecab
# yum install -y groonga-normalizer-mysql
# yum install groonga-httpd

2.軽く検証
  とりあえず住所漢字とカナだけ入れたテーブルを定義。

# vi table.ddl
table_create text TABLE_PAT_KEY UInt32                                          
column_create text full_address_kana COLUMN_SCALAR LongText                     
column_create text full_address_kanji COLUMN_SCALAR LongText                    
table_create text-text TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram  
column_create text-text index COLUMN_INDEX|WITH_SECTION|WITH_POSITION text title
,text

  作った定義を反映させ、サービス再起動。

# groonga -n /var/lib/groonga/db/tokudb < table.ddl
# chown groonga:groonga /var/lib/groonga/db/tokudb*                                                                                                               
# systemctl restart groonga-httpd

  デフォルトだとport 10041でサービス提供しているが、tokudbって別のファイル作ってしまったので、別ポートでサービス立ち上げる。

# groonga -p 8080 -d --protocol http /var/lib/groonga/db/tokudb

  この時点でブラウザから http://マシンのIPまたはホスト名:8080/ で色々確認可能。
  そして検索用データをとりあえず二件投入。日本語検索失敗した時のため、full_address_kanaにxxxxxxのレコードも入れておく。

# curl -X POST 'http://localhost:8080/d/load?table=text' -d '[{"_key":90600000,"full_address_kana":"ホッカイドウサッポロシチュウオウク","full_address_kanji":"北海道札幌市中央区"}]'
# curl -X POST 'http://localhost:8080/d/load?table=text' -d '[{"_key":90600001,"full_address_kana":"xxxxxx","full_address_kanji":"北海道札幌市中央区"}]'

  検索。うまく日本語でも検索できた。結果は見やすい様に改行をいれてある。

# curl 'http://localhost:8080/d/select?table=text&match_columns=full_address_kanji&query=北海道'     
    [
        [0,1483431027.866515,0.9462976455688477],
        [
            [
                [2],
                [["_id","UInt32"],["_key","UInt32"],["full_address_kana","LongText"],["full_address_kanji","LongText"]],
                [1,90600000,"ホッカイドウサッポロシチュウオウク","北海道札幌市中央区"],
                [2,90600001,"xxxxxx","北海道札幌市中央区"]
            ]
        ]
    ]

  続いて、アナライズ確認。MeCab指定なので、結果はElasticsearchの時と同じだが、iPhoneiphoneな所が異なる。
  この辺は設定かな。

# groonga                                               
> register normalizers/mysql                                                    
    [[0,1483431378.979351,0.0401461124420166],true]                                 
> tokenize TokenMecab "iPhoneは人々の生活を一変させました。" NormalizerAuto     
    [
        [0,1483431439.346163,0.2017147541046143],
        [
            {"value":"iphone","position":0,"force_prefix":false},
            {"value":"","position":1,"force_prefix":false},
            {"value":"人々","position":2,"force_prefix":false},
            {"value":"","position":3,"force_prefix":false},
            {"value":"生活","position":4,"force_prefix":false},
            {"value":"","position":5,"force_prefix":false},
            {"value":"一変","position":6,"force_prefix":false},
            {"value":"","position":7,"force_prefix":false},
            {"value":"","position":8,"force_prefix":false},
            {"value":"まし","position":9,"force_prefix":false},
            {"value":"","position":10,"force_prefix":false},
            {"value":"","position":11,"force_prefix":false}
        ]
    ]                                                                          

  

Elasticsearch 5.1.1 on CentOS 7.3

ちょっと聞かれて気になったので、少し触ってみた。
手順は以下
1.Java 1.8インストール
2.Elasticsearchインストール
3.Kibanaインストール
4.Kuromojiインストール
5.elasticsearch_headインストール
6.軽く検証

1.Java 1.8インストール
  ここは普通にyumで。

# yum install -y java-1.8.0-openjdk-devel
# yum install -y java-1.8.0-openjdk-debuginfo --enablerepo=*debug*

2.Elasticsearchインストール
  以下を参考にして作業。
  https://www.elastic.co/guide/en/elasticsearch/reference/5.1/rpm.html

# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# vim /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

  インストールと起動。

# yum install elasticsearch
# systemctl enable elasticsearch
# systemctl start elasticsearch

  コマンドから確認

# curl http://localhost:9200
{
  "name" : "GiUG9xz",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "AMjCeFIvRdqBdQXcGuHDHQ",
  "version" : {
    "number" : "5.1.1",
    "build_hash" : "5395e21",
    "build_date" : "2016-12-06T12:36:15.409Z",
    "build_snapshot" : false,
    "lucene_version" : "6.3.0"
  },
  "tagline" : "You Know, for Search"
}

  デフォルトではローカルホストからしかアクセスできないので、他コンピュータからもブラウザ経由で確認できるよう、設定を変更。
  https://www.elastic.co/guide/en/elasticsearch/reference/5.1/important-settings.html

# vi /etc/elasticsearch/elasticsearch.yml

# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
#network.host: 192.168.0.1
network.host: 0.0.0.0

  再起動。

# systemctl restart elasticsearch

  これで他マシンからも http://マシンのIPまたはホスト名:9200/ でコマンド結果と同じものを参照できる。

3.Kibanaインストール
  これまたオフィシャルのドキュメントに従い作業。
  https://www.elastic.co/guide/en/kibana/5.1/rpm.html

# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# vim /etc/yum.repos.d/kibana.repo
[kibana-5.x]
name=Kibana repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

  インストールと起動。

# yum install kibana
# systemctl enable kibana
# systemctl start kibana

  以下を参考にconfigを変更して、他マシンからも参照できる様に変更。
  https://www.elastic.co/guide/en/kibana/5.1/settings.html

# vim /etc/kibana/kibana.yml

# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
server.host: "マシンのIPまたはホスト名"

# The URL of the Elasticsearch instance to use for all your queries.
elasticsearch.url: "http://localhost:9200"

  再起動。

# systemctl restart kibana

  ブラウザで確認
  http://マシンのIPまたはホスト名:5601

4.Kuromojiインストール
  日本語の形態素解析用に、Kuromojiを導入。
  公式ページ(http://www.atilika.org/)を見るに、MeCabをサポートしていると。

# /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
# systemctl restart elasticsearch

  以下でplugin部分にkuromojiがあることが確認できる。
  http://マシンのIPまたはホスト名:9200/_nodes/plugins?pretty

      "plugins" : [
        {
          "name" : "analysis-kuromoji",
          "version" : "5.1.1",
          "description" : "The Japanese (kuromoji) Analysis plugin integrates Lucene kuromoji analysis module into elasticsearch.",
          "classname" : "org.elasticsearch.plugin.analysis.kuromoji.AnalysisKuromojiPlugin"
        }

  アナライザーの設定は以下のようにするのが公式の様だが、日本人の皆さんは非推奨の模様。
  うまく動かなかったり、index毎に指定するのがよろしいとの事。

# vi /etc/elasticsearch/elasticsearch.yml
index.analysis.analyzer.default.type: custom
index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer

  よって今回は上記の案を使用せず、この様に指定。tokutestという、kuromojiをanalizerに指定したindexを作成。
  "mode": searchはデフォルトだそうなので、ひとまず省略。

# curl -XPUT http://localhost:9200/tokutest -d ' 
{
  "index": {
    "analysis": {
      "tokenizer": {
        "kuromoji_user_dict": {
          "type": "kuromoji_tokenizer"
        }
      },
      "analyzer": {
        "myanalyzer": {
          "type": "custom",
          "tokenizer": "kuromoji_user_dict"
        }
      }
    }
  }
}'

  ここでkuromojiを使用するときとしないときとで結果がどのように変わるか確認。
  kuromojiを使用する場合。

# curl -XPOST 'http://localhost:9200/tokutest/_analyze?analyzer=myanalyzer&pretty' -d 'iPhoneは人々の生活を一変させました。'
{
  "tokens" : [
    {
      "token" : "iPhone",
      "start_offset" : 0,
      "end_offset" : 6,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "word",
      "position" : 1
    },
    {
      "token" : "人々",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "word",
      "position" : 2
    },
    {
      "token" : "",
      "start_offset" : 9,
      "end_offset" : 10,
      "type" : "word",
      "position" : 3
    },
    {
      "token" : "生活",
      "start_offset" : 10,
      "end_offset" : 12,
      "type" : "word",
      "position" : 4
    },
    {
      "token" : "",
      "start_offset" : 12,
      "end_offset" : 13,
      "type" : "word",
      "position" : 5
    },
    {
      "token" : "一変",
      "start_offset" : 13,
      "end_offset" : 15,
      "type" : "word",
      "position" : 6
    },
    {
      "token" : "",
      "start_offset" : 15,
      "end_offset" : 16,
      "type" : "word",
      "position" : 7
    },
    {
      "token" : "",
      "start_offset" : 16,
      "end_offset" : 17,
      "type" : "word",
      "position" : 8
    },
    {
      "token" : "まし",
      "start_offset" : 17,
      "end_offset" : 19,
      "type" : "word",
      "position" : 9
    },
    {
      "token" : "",
      "start_offset" : 19,
      "end_offset" : 20,
      "type" : "word",
      "position" : 10
    }
  ]
}

  kuromojiを使用しない場合。

# curl -XPOST 'http://localhost:9200/tokutest/_analyze?pretty' -d 'iPhoneは人々の生活を一変させました。'
{
  "tokens" : [
    {
      "token" : "iphone",
      "start_offset" : 0,
      "end_offset" : 6,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "",
      "start_offset" : 6,
      "end_offset" : 7,
      "type" : "<HIRAGANA>",
      "position" : 1
    },
    {
      "token" : "",
      "start_offset" : 7,
      "end_offset" : 8,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "",
      "start_offset" : 8,
      "end_offset" : 9,
      "type" : "<ALPHANUM>",
      "position" : 3
    },
    {
      "token" : "",
      "start_offset" : 9,
      "end_offset" : 10,
      "type" : "<HIRAGANA>",
      "position" : 4
    },
    {
      "token" : "",
      "start_offset" : 10,
      "end_offset" : 11,
      "type" : "<IDEOGRAPHIC>",
      "position" : 5
    },
    {
      "token" : "",
      "start_offset" : 11,
      "end_offset" : 12,
      "type" : "<IDEOGRAPHIC>",
      "position" : 6
    },
    {
      "token" : "",
      "start_offset" : 12,
      "end_offset" : 13,
      "type" : "<HIRAGANA>",
      "position" : 7
    },
    {
      "token" : "",
      "start_offset" : 13,
      "end_offset" : 14,
      "type" : "<IDEOGRAPHIC>",
      "position" : 8
    },
    {
      "token" : "",
      "start_offset" : 14,
      "end_offset" : 15,
      "type" : "<IDEOGRAPHIC>",
      "position" : 9
    },
    {
      "token" : "",
      "start_offset" : 15,
      "end_offset" : 16,
      "type" : "<HIRAGANA>",
      "position" : 10
    },
    {
      "token" : "",
      "start_offset" : 16,
      "end_offset" : 17,
      "type" : "<HIRAGANA>",
      "position" : 11
    },
    {
      "token" : "",
      "start_offset" : 17,
      "end_offset" : 18,
      "type" : "<HIRAGANA>",
      "position" : 12
    },
    {
      "token" : "",
      "start_offset" : 18,
      "end_offset" : 19,
      "type" : "<HIRAGANA>",
      "position" : 13
    },
    {
      "token" : "",
      "start_offset" : 19,
      "end_offset" : 20,
      "type" : "<HIRAGANA>",
      "position" : 14
    }
  ]
}

  使わない場合は日本語全部一文字ずつになってますな。
  あと、kuromojiを使用した場合はiPhoneになっているが、使用しない場合はiphoneと小文字になっている。

5.elasticsearch_headインストール
  以下によると、バージョン5はプラグイン対応していないので、自前で入れて頂戴なという事なので。
  https://github.com/mobz/elasticsearch-head
  以下を参考に導入。
  https://github.com/mobz/elasticsearch-head#running-with-built-in-server

# yum install -y npm --enablerepo=epel
# npm install -g grunt-cli
# git clone git://github.com/mobz/elasticsearch-head.git
# cd elasticsearch-head
# npm install

  他マシンからアクセスするので、 _site/app.jsのElasticsearch接続先を変更("http://localhost:9200" → "http://マシンのIPまたはホスト名:9200")。

# vi _site/app.js
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://マシンのIPまたはホスト名:9200";

  あと、CORS (Cross-Origin Resource Sharing)対応として以下を追記したのち、

# vi /etc/elasticsearch/elasticsearch.yml 
http.cors.enabled: true                                                         
http.cors.allow-origin: "*"

  gruntで起動。

# grunt server

  elasticsearch_headに接続。デフォルトから変更していない場合、9200はElasticsearchで、headは9100。
  http://マシンのIPまたはホスト名:9100/

6.軽く検証
  例によって以下から住所データを取り込んでみた。
  http://www.post.japanpost.jp/zipcode/download.html

  以下のようなjsonファイル(zip.json)を作成し、

{"create":{"_id":"90600000"}}
{"id": 90600000,"zipcd": "0600000","created": "2017/01/02 20:00:00","updated": "2017/01/02 20:00:00","full_address_kana": "ホッカイドウサッポロシチュウオウク","full_address_kanji": "北海道札幌市中央区"}
{"create":{"_id":"90640941"}}
{"id": 90640941,"zipcd": "0640941","created": "2017/01/02 20:00:00","updated": "2017/01/02 20:00:00","full_address_kana": "ホッカイドウサッポロシチュウオウクアサヒガオカ","full_address_kanji": "北海道札幌市中央区旭ケ丘"}

  以下コマンドで一気に取り込む。データ数は124,060件。

# curl -XPOST http://localhost:9200/manholes/geo/_bulk --data-binary @zip.json

  検索はコマンドだと以下。

# curl -X  GET http://localhost:9200/tokutest/zip/_search -d '
{
  "query": {
    "match": {
      "full_address_kanji": "久留米"
    }
  }
}'

  elasticsearch_headだとこう。21msecで3,613件ヒットしたうち、(件数指定がないのでデフォルトの)先頭10件を返却している。
  
  悪くない感じ。