わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

Elasticsearchで,ミイラ取りがミイラに

ゼミ発表でElasticsearchの動作が思うようにいかないと報告があり,自分でも動かしたり,あれこれしたりしていました.
公式サイトのInstallation*1から始めて,チュートリアルを一通り動かし,kuromoji関連を自習したところで,学生の一人から,自作のマッピングの内容を含むメールが届きました.
そこで「{ "type": "string", "analyzer": "kuromoji_analyzer" }」と書かれているのに,違和感を持ちました.「kuromoji_analyzer」について,検索しても,これを使った事例が出てきません.どうやら独自にanalyzerを作るための定義名らしく,そういうのを作らないことにして,「{ "type": "string", "analyzer": "kuromoji" }」と書くよう指示しました.
次に,悪戦苦闘している2人の学生に,研究室に来てもらい*2,自分もノートPCを用意して,こちらで動かしたときの手順を,メールで送り,試してもらいました.
こちらは研究室内のLinuxマシンにインストールし,WindowsのノートPCを使ってそこにSSHで入ってから,登録や検索などを行っています> /etc/elasticsearch/elasticsearch.yml」としておけば,他の計算機からも通信できますが,[http://sebrain.web.fc2.com/document/0064.html]には勝手にシャットダウンされるとありますし,それどころか任意のドキュメントを取得し放題,インデックスなども作り放題,消し放題になりますので,よくありませんね.">*3.学生たちは,それぞれのWindowsのノートPCにインストールしたElasticsearchを使います.こちらの手順書をもとに,同じインデックスなどを作り,こちらで用意した初期データ10件を登録してもらったあと,日本語の入った検索が,うまくいかないという状況を把握しました.
ASCII文字だけなら,大丈夫です.コマンドプロンプトで,手軽にUTF-8にする方法はないか,いや…
ASCII文字だけで検索して,登録したデータの中に全角英字が含まれていて,そこにマッチする状況を見つけました.学生にもさせてみると,文字化けはしますが,同じ結果になりました.これによって,各ノートPCのElasticsearchプロセス(「シャード」と言うのでしたっけ)にも,kuromojiで処理された内容をきちんと保持しれていて,全角半角の違いにも対応しているのを,確認できました.
ではコマンドで検索するのではなく,Webアプリケーションの開発に移りますか…といったところで,Pure JavaJSPで書くというのは,どうにも手間がかかります.RESTでJSONを送ればJSONが返るという仕組みから,アプリケーションはJavaScriptで書くのがいいのではと提案し,ミーティングはそこまでとして,簡単な検索と登録の入力フォームを作って学生に渡しました.
学生に渡す直前に,気になる振る舞いに気づきました.match_allで問い合わせて,結果に「"total" : 13」と返ってくるにも関わらず,結果に含まれている実際のレコードは10件だけなのです.登録を増やしても変わりません.match_allではなくmatchで検索しても,"total"が10以上のときは10件分だけです.
elasticのサイト内に,答えが載っていました*4."from defaults to 0, and size defaults to 10."です.サイズのデフォルトは10,ということでした.
そこでコマンドラインからの問い合わせの際に,これまで(host,index,typeはそれぞれシェル変数)

curl -XPOST "${host}:9200/${index}/${type}/_search?pretty" -d '{"query":{"match_all":{}}}'

としていたのを

curl -XPOST "${host}:9200/${index}/${type}/_search?pretty" -d '{"size":10000,"query":{"match_all":{}}}'

に変更すると,期待どおり,全件のレコードを含むJSONが返ってきました.検索フォームにも,書き足しました.
明日また3年生と顔を合わせます.来週がゼミ最終回…その際に,企画案どおりに動くものを見たいのですが.

*1:https://www.elastic.co/guide/en/elasticsearch/reference/2.1/_installation.html

*2:3年生は研究室内に座席がありません.ミーティングは共用机に集まって,実施しています.

*3:「echo "network.host: 0.0.0.0" >> /etc/elasticsearch/elasticsearch.yml」としておけば,他の計算機からも通信できますが,http://sebrain.web.fc2.com/document/0064.htmlには勝手にシャットダウンされるとありますし,それどころか任意のドキュメントを取得し放題,インデックスなども作り放題,消し放題になりますので,よくありませんね.

*4:https://www.elastic.co/guide/en/elasticsearch/reference/2.1/search-request-from-size.html