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() # 行列を入れ替えてプロット
グラフはこうなった。
コメント入れたので特に説明は不要だろう。
RHEL7.5 上でPython3.6動かす
作業メモ。
anaconda使わないでmod_wsgi経由のDjango起動まで。
RHELはAWSにある既存のやつ(↓)から、インスタンスタイプは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
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の時と同じだが、iPhone→iphoneな所が異なる。
この辺は設定かな。
# 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.軽く検証
# 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
{"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件を返却している。
悪くない感じ。