Elasticsearch は Apache Solr と同様に内部的に Apache Lucene を利用した全文検索アプリケーションです。公式ページをもとに導入手順および基本的なコマンド例をまとめます。
最新バージョンへのリンクは Downloads | Elasticsearch から調べてください。
$ sudo yum install java-1.8.0-openjdk
$ sudo rpm -ivh https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.2.noarch.rpm
$ sudo chkconfig --add elasticsearch
$ sudo service elasticsearch start
curl 'localhost:9200/_cat/health?v'
curl 'localhost:9200/_cat/nodes?v'
curl 'localhost:9200/_cat/indices?v'
curl 'localhost:9200/_cat/shards?v'
customer
という名称でインデックスを作成/削除するためには以下のようにします。pretty
を指定することでレスポンス JSON を整形して表示できます。
$ curl -XPUT 'localhost:9200/customer?pretty'
$ curl -XDELETE 'localhost:9200/customer?pretty'
external
タイプのドキュメントを customer
インデックスに追加するためには以下のようにします。既に指定 ID のドキュメント存在している場合は更新になります。
$ curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
"name": "John Doe"
}'
$ curl -XGET 'localhost:9200/customer/external/1?pretty'
ID を自動生成させることも可能です。
$ curl -XPOST 'localhost:9200/customer/external?pretty' -d '
{
"name": "Jane Doe"
}'
明示的に更新するためには以下のようにします。
$ curl -XPOST 'localhost:9200/customer/external/1/_update?pretty' -d '
{
"doc": { "name": "Jane Doe", "age": 20 }
}'
削除には DELETE を指定します。_query
で条件指定すれば複数ドキュメントを一括削除できます。
$ curl -XDELETE 'localhost:9200/customer/external/1?pretty'
$ curl -XDELETE 'localhost:9200/customer/external/_query?pretty' -d '
{
"query": { "match": { "name": "John" } }
}'
ドキュメントを二つ作成
$ curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
'
id:1 を更新して id:2 を削除
$ curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
'
JSON GENERATOR をもとに作成された ダミーデータ をインデックスにドキュメントとして追加しましょう。
$ curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json
$ curl 'localhost:9200/_cat/indices?v'
'*' ワイルドカードですべてに一致かつ pretty で整形して表示。既定では 10 ドキュメントだけ表示。
$ curl 'localhost:9200/bank/_search?q=*&pretty'
並べ替えや LIMIT と OFFSET 指定もできます。_source
を指定すれば必要な情報だけを取得できます。
$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"query": { "match_all": {} },
"_source": ["account_number", "balance", "age"],
"sort": { "age": { "order": "desc" } },
"from": 10,
"size": 1
}'
account_number
が 20
$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"query": { "match": { "account_number": 20 } }
}'
address
に mill が含まれる (大文字小文字を区別しない)
$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"query": { "match": { "address": "mill" } }
}'
address
に mill または lane のどちらかが含まれる (大文字小文字を区別しない)
$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"query": { "match": { "address": "mill lane" } }
}'
$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"query": {
"bool": {
"should": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}'
address
に "mill lane" が含まれる (大文字小文字を区別しない)
$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"query": { "match_phrase": { "address": "mill lane" } }
}'
address
に mill と lane が両方含まれる (大文字小文字を区別しない)
$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}'
address
に mill も lane も含まない (大文字小文字を区別しない)
$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"query": {
"bool": {
"must_not": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}'
must
, should
, must_not
は同時に複数指定できます。
$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}'
query と異なり、検索結果に点数を付与せず結果をメモリキャッシュするため高速です。関連度を示す値である score を必要としない場合は filter を使用します。query と併用できます。以下は「20000 以上 30000 以下」の例です。
$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"query": {
"filtered": {
"query": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}'
SQL の GROUP BY のような概念です。通常の query 結果も同時に返されるため、以下の例ではその size を 0 にして結果を取得しないようにしています。state で集約したグループの COUNT(*)
が大きい順に 10 件取得します。
$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state"
}
}
}
}'
平均値を取得しつつ平均値が大きい順に並べ替え (既定値: 上位 10 件を取得)
$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state",
"order": {
"average_balance": "desc"
}
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}'
20-29, 30-39, 40-49 の 3 グループに分類して、それぞれのグループ内で更に gender 毎に集約して balance の平均値を表示
$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"size": 0,
"aggs": {
"group_by_age": {
"range": {
"field": "age",
"ranges": [
{
"from": 20,
"to": 30
},
{
"from": 30,
"to": 40
},
{
"from": 40,
"to": 50
}
]
},
"aggs": {
"group_by_gender": {
"terms": {
"field": "gender"
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
}
}'
本ページ上述の手順にしたがい rpm でインストールした場合は以下のファイルを編集することでシステム設定が可能です。
$ vi /etc/sysconfig/elasticsearch ← /etc/init.d/elasticsearch で読み込まれます
$ vi /etc/elasticsearch/elasticsearch.yml
/etc/sysconfig/elasticsearch
# Elasticsearch data directory
DATA_DIR=/var/lib/elasticsearch
/etc/sysconfig/elasticsearch
# Heap size defaults to 256m min, 1g max
# Set ES_HEAP_SIZE to 50% of available RAM, but no more than 31g
ES_HEAP_SIZE=256m
/etc/elasticsearch/elasticsearch.yml
# Set both 'bind_host' and 'publish_host':
#
network.host: 127.0.0.1