登録用文書のテンプレート設定
文書登録の前に、Elasticsearchでは文書を登録する際にあらかじめどのような形で登録するかを設定できるので、その設定を行っておきます。
{ "order": 0, "template": "contents-*", "settings": { "index": { "number_of_shards": "1", "number_of_replicas": "0" } }, "mappings": { "contents": { "_source": { "enabled": true }, "_all": { "analyzer": "ja", "enabled": true }, "properties": { "body_text": { "search_analyzer": "ja_synonym", "analyzer": "ja", "type": "string" } } } }, "aliases": { } }
文書登録に関連する部分のみ説明します。
- 「"template": "contents-*"」:登録する文書が「contents-」で始まる場合は今回のテンプレートを使用するという意味になります。
- 「"properties"」:登録する文書のフォーマットを設定しています。今回は単純にするため"body_text"の要素しか持たない形にしました。文書登録の場合は用途によって異なりますが、登録日やキーワード、文書の種類を登録しておくと、検索の際のバリエーションを増やしたりピンポイントで文書を選んだりできるようになります。
- 「"body_text"」:登録する文書を設定しています。
- 「"search_analyzer"」:検索の時のみに使用する"analyzer"を前回の記事で設定した"ja_synonym"に指定しています。
- 「"analyzer"」:文書登録の時に使用する"analyzer"を前回の記事で設定した"ja"に指定をしています。
文書登録から検索処理
下記がElasticsearchをテストで起動させて文書登録用のテンプレートを反映させ、文書登録から文書の検索、登録された文書の確認までを行うスクリプトです。
#!/bin/bash 略 # -- Body --------------------------------------------------------- # SCRIPT LOGIC GOES HERE ROOT_DIR=`pwd` # Elasticsearchの起動 sudo /etc/init.d/elasticsearch start & sleep 10s # 文書登録用テンプレートの反映 curl -XPUT localhost:9200/_template/contents --data-binary \ "@config/elastic_index_template.json" sleep 10s echo Register # 文書登録処理 curl -X POST http://localhost:9200/contents-20160111/contents/1 -d ' { "body_text" : "今回、作成したUbuntuでのDocker環境の構築方法です。" } ' sleep 1s echo Search # 文書検索処理 curl -XGET 'localhost:9200/contents-20160111/contents/_search?pretty' -d' { "query":{"match":{"body_text":"環境"}} }' # 登録された文書の確認 curl 'localhost:9200/_cat/indices?v' # -----------------------------------------------------------------
上記のスクリプトで"環境"を含むテキストを保存して検索処理を行っています。下記でスクリプトを実行します。sudoを使用しているため、パスワードを求められた際にe_passと入力してください。
sh shell/elastic_search_setting.sh
上記のスクリプトの実行結果が下記になります。
補足
通常の設定だと権限の関係で今回の設定で動作できないため、elasticsearchの動作用ファイルのstartの実行時に"--security.manager.enabled false"を指定するようにしています。セキュリティ上は問題がありますが、通常動作させることを優先したため下記のような対応になっています。
[ ok ] Starting Elasticsearch Server:. 略 {"_index":"contents-20160111","_type":"contents","_id":"1","_version":1,"_shards":{"total":1,"successful":1,"failed":0},"created":true}Search { "took" : 102, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.095891505, "hits" : [ { "_index" : "contents-20160111", "_type" : "contents", "_id" : "1", "_score" : 0.095891505, "_source" : { "body_text" : "今回、作成したUbuntuでのDocker環境の構築方法です。" } } ] } } health status index pri rep docs.count docs.deleted store.size pri.store.size green open contents-20160111 1 0 1 0 3.2kb 3.2kb
登録用のクエリについて
curl -X POST http://localhost:9200/contents-2016/contents/1 -d ' { "body_text" : "今回、作成したUbuntuでのDocker環境の構築方法です。" }'
- 「curl」:POST処理で文書を登録しています。
- 「http://localhost:9200/contents-20160111/contents/1」:localhostに立てたElasticsearchはポート番号9200を開いているので、そこに「インデックス名:"contents-20160111"、タイプ名:"contents"、登録文書id:"1"」で登録しています。
- 「"body_text"」:ここで登録用の文書を設定しています。
検索用のクエリについて
curl -XGET 'localhost:9200/contents-20160111/contents/_search?pretty' -d' { "query":{"match":{"body_text":"環境"}} }'
- 「curl」:GET処理で文書を検索しています。
- 「"body_text"」:ここを変更することで、どのような文字列とマッチしたいかを指定できます。複数項目を登録している場合は、"body_text"部分を変更して検索対象の変更が行えます。
文書の検索には手法としてクエリとフィルターがあります。単純なマッチングでは上記のようなクエリを使用しますが、範囲を絞りたいなどのニーズがあればフィルターの方が手法としては適切です。クエリとフィルターを組み合わせる高度な手法もあります。