データの検索は、基本的に2つの方法がある
- REST request URI
- REST request body
ここでは以下のtypeのindexに対して検索を行うものとする
{
"account_number": 0,
"balance": 16623,
"firstname": "Bradshaw",
"lastname": "Mckenzie",
"age": 29,
"gender": "F",
"address": "244 Columbus Place",
"employer": "Euron",
"email": "bradshawmckenzie@euron.com",
"city": "Hobucken",
"state": "CO"
}
検索のためのREST APIは_search
エンドポイントからアクセスできます。
$ curl -XGET 'localhost:9200/bank/_search?q=*&sort=account_number:asc&pretty&pretty'
q=*・・・bankインデックス内のすべてのdocumentにマッチするということ
sort=account_number:asc・・・account_numberフィールドを使って検索結果をasc順にソートする
{
"took" : 63,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1000,
"max_score" : null,
"hits" : [ {
"_index" : "bank",
"_type" : "account",
"_id" : "0",
"sort": [0],
"_score" : null,
"_source" : {
"account_number":0,"balance":16623,"firstname":"Bradshaw","lastname":"Mckenzie","age":29,"gender":"F","address":"244 Columbus Place","employer":"Euron","email":"bradshawmckenzie@euron.com","city":"Hobucken","state":"CO"
}
},
{
"_index" : "bank",
"_type" : "account",
"_id" : "1",
"sort": [1],
"_score" : null,
"_source" : {
"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"
}
}, ...
]
}
}
took・・・検索の実行時間(ms)
timed_out・・・もし検索がタイムアウトしたら、true
_shards・・・どれくらいの数のshardが検索されたかを表す
hits・・・検索の結果
hits.total・・・検索にマッチしたdocumentの数
hits.hits・・・実際の検索結果の配列(デフォルトでは、はじめの10件)
sort・・・結果のsortキー
_score・・・指定した検索クエリにどれだけdocumentがマッチしているかを表す数値的指標。高ければ高いほど関連があるdocumentになる
上記と同じ検索をREST request APIで行う場合
$ curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
]
}'
詳しくはQuery DSLを参照。ここではいくつかの基本的な例を挙げる。
$ curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} }, #検索内容
"from": 10, #検索結果をどこから表示するか
"size": 10, #検索結果数の指定
"sort": { "balance": { "order": "desc" } } #検索結果の順番
}'
いくつかの基本的な検索パラメータを見ていく。
[_source]
検索結果に表示するfieldの指定。select account_number, blance from bank;のようなもの
$ curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} },
"_source": ["account_number", "balance"]
}'
[matchクエリ]
特定のfieldを検索
$ curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'
{
"query": { "match": { "account_number": 20 } } #account numberが20のデータを返す
}'
$ curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'
{
"query": { "match": { "address": "mill" } } #addressフィールドに"mill"を含むデータを返す
}'
$ curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'
{
"query": { "match": { "address": "mill lane" } } #addressフィールに"mill"もしくは"lane"を含むデータを返す
}'
$ curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'
{
"query": { "match_phrase": { "address": "mill lane" } } #addressフィールドに"mill lane"を含むデータを返す
}'
[boolクエリ]
addressフィールドに"mill"と"lane"が含まれているデータを返す
$ curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}'
addressフィールドに"mill"か"lone"が含まれているデータを返す
$ curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"should": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}'
addressフィールドに"mill"と"lane"を含まないデータを返す
$ curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must_not": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}'
すべてのデータの中から("must": {"match_all": {}})blanceフィールドの値が2000以上で3000以下のデータを返す
$ curl -XGET 'localhost:9200/bank/_search?pretty' -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}'