ElasticSearch学習ノート(一)-クエリーと集約

5983 ワード

ElasticSearchは検索エンジンであり、データベースとしても使用できます.その中のindexはリレーショナル・データベースのdatabaseに相当し、typeはリレーショナル・データベースのtableに相当する.本稿では、テストインデックスteとテストタイプuserを作成し、userに保存するデータを挿入する準備をします.jsonファイルでuser.jsonファイルの内容は以下の通りです.
{"index":{"_id":"1"}}
{"username":"aoa","money":1000,"age":32,"city":"nanjing"}
{"index":{"_id":"2"}}
{"username":"bob","money":2000,"age":15,"city":"nanjing"}
{"index":{"_id":"3"}}
{"username":"coc","money":3000,"age":15,"city":"beijing"}
{"index":{"_id":"4"}}
{"username":"dod","money":4000,"age":15,"city":"beijing"}
{"index":{"_id":"5"}}
{"username":"eoe","money":5000,"age":15,"city":"shanghai"}
{"index":{"_id":"6"}}
{"username":"fof","money":6000,"age":15,"city":"shanghai"}

上は12行でuserにコピーされていますjsonファイルの場合user.jsonファイルの末尾には必ず空白行を1行多くしなければなりません.そうしないと、6番目のデータ(ドキュメント)は挿入できません.
そしてuser.jsonが存在するフォルダの下で端末を開き、コマンドを入力
curl -XPOST "127.0.0.1:9200/te/user/_bulk?pretty" --data-binary @user.json

上記のコマンドでは、teというインデックスとuserというタイプを作成し、6つのテストデータを挿入します.ブラウザで開くhttp://127.0.0.1:9200/_mappingインデックス、タイプの構造を表示できます.
次はクエリーできます.まず簡単なブールクエリーをしましょう.headプラグインに入力してクエリーすることができます.
    1.クエリーcityはnanjingではなく、年齢32または15のuserであり、usernameおよびcityフィールドのみが表示されます.
POST http://127.0.0.1:9200/te/user/_search
{
	"_source":["username","city"],
	"query":{
		"bool":{
			"must":[
				{
					"terms":{
						"age":[32,15]
					}
				}
			],
			"must_not":{
				"term":{
					"city":"nanjing"
				}
			}
		}
	}
}

メトリックの再集約-最小値の集約
    2.クエリー年齢が15でmoneyが最も少ないuserのmoney数
POST http://127.0.0.1:9200/te/user/_search
{
	"query":{
		"term":{
			"age":15
		}
	},
	"aggs":{
		"my_agg_name":{
			"min":{
				"field":"money"
			}
		}
	}
}
注意、戻り結果は「aggregations」で、「hits」ではなく、「hits」で返された結果は「query」の条件に対応します.
次の結果を返します.
{
	...
	"aggregations":{
		"my_agg_name":{
			"value":2000
		}
	}
}

メトリックの集約をもう1つ作成-平均集約
    3.すべてのuserのmoneyの平均値をクエリー
POST http://127.0.0.1:9200/te/user/_search
{
	"aggs":{
		"my_agg_name":{
			"avg":{
				"field":"money"
			}
		}
	}
}
注意、戻り結果は「aggregations」にあり、「hits」にはありません.「query」がないため、「hits」にはすべてのuserが返されます.
次の結果を返します.
{
	...
	"aggregations":{
		"my_agg_name":{
			"value":3500
		}
	}
}

もう一つのグループ(バケツ)重合-範囲重合をする
    4.クエリーmoney範囲(-無限,1000)、[1000,3000)、[3000,+無限)の3区間のuser数
POST http://127.0.0.1:9200/te/user/_search
{
	"aggs":{
		"my_agg_name":{
			"range":{
				"field":"money",
				"ranges":[
					{"to":1000},
					{"from":1000,"to":3000},
					{"from":3000}
				]
			}
		}
	}
}

次の結果を返します.
{
	...
	"aggregations":{
		"my_agg_name":{
			"buckets":[
				{
					"key":"*-1000.0",
					"to":1000,
					"to_as_string":"1000.0",
					"doc_count":0
				},
				{
					"key":"1000.0-3000.0",
					"from":1000,
					"from_as_string":"1000.0",
					"to":3000,
					"to_as_string":"3000.0",
					"doc_count":2
				},
				{
					"key":"3000.0-*",
					"from":3000,
					"from_as_string":"3000.0",
					"doc_count":4
				}
			]
		}
	}
}

パイプ集約をもう1つ作成-平均グループ集約
    5.クエリmoney範囲(-無限,1000),[1000,3000],[3000,+無限)の3つの区間のそれぞれのuserのmoneyの合計
POST http://127.0.0.1:9200/te/user/_search
{
	"aggs":{
		"my_agg_name":{
			"range":{
				"field":"money",
				"ranges":[
					{"to":1000},
					{"from":1000,"to":3000},
					{"from":3000}
				]
			},
			"aggs":{
				"my_agg_name_child":{
					"sum":{"field":"money"}
				}
			}
		},
		"my_agg_name_2":{
			"avg_bucket":{"buckets_path":"my_agg_name>my_agg_name_child"}
		}
	}
}
戻り結果から見ると、
my_agg_nameはバケツ重合(「my_agg_name」の下に「buckets」)であり、
my_agg_name_2はメジャー集約です(「my_agg_name_2」の下に「value」があります).
次の結果を返します.
{
	...
	"aggregations":{
		"my_agg_name":{
			"buckets":[
				{
					"key":"*-1000.0",
					"to":1000,
					"to_as_string":"1000.0",
					"doc_count":0,
					"my_agg_name_child":{
						"value":0
					}
				},
				{
					"key":"1000.0-3000.0",
					"from":1000,
					"from_as_string":"1000.0",
					"to":3000,
					"to_as_string":"3000.0",
					"doc_count":2,
					"my_agg_name_child":{
						"value":3000
					}
				},
				{
					"key":"3000.0-*",
					"from":3000,
					"from_as_string":"3000.0",
					"doc_count":4,
					"my_agg_name_child":{
						"value":18000
					}
				}
			]
		},
		"my_agg_name_2":{
			"value":10500
		}
	}
}

まとめ:本稿では,タイプuserを用いて5つの例を述べたが,タイプのネストには触れなかったが,入門したほうがよい例でもある.ソースコードhttps://download.csdn.net/download/qq_27311165/10470133ダウンロードします.(この圧縮ファイルの中の文字と本文のメモの差は多くありません.しかし、設定リソースは最低1点で無料ではありません.点数の少ないユーザーはダウンロードをお勧めしません)