Elasticsearch7.6スタディノート1 Elasticsearchの使用開始
序文
信頼できるガイドの中国語はたったの2.xですが、現在esは7.6に達しています。学ぶために最新のものをインストールしてください。
インストールする
これは学習インストールであり、本番インストールは別のロジックセットです。
勝つ
esダウンロードアドレス:
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.0-windows-x86_64.zip
Kibanaダウンロードアドレス:
https://artifacts.elastic.co/downloads/kibana/kibana-7.6.0-windows-x86_64.zip
現在の公式最新版は7.6.0ですが、ダウンロード速度はひどいため、Thunderのダウンロード速度を使用するとxMに達する可能性があります。
bin\elasticsearch.bat
bin\kibana.bat
batをダブルクリックして開始します。
Dockerのインストール
テストと学習のために、公式のDockerイメージを直接使用する方がより高速で便利です。
インストール方法を参照してください:https : //www.cnblogs.com/woshimrf/p/docker-es7.html
以下は、
https://www.elastic.co/guide/en/elasticsearch/reference/7.6/getting-started.html
一部のドキュメントにインデックスを付ける
このテストでは、kibanaを直接使用します。もちろん、curlまたはpostmanを介してlocalhost:9200にアクセスすることもできます。
localhost:5601にアクセスし、[開発ツール]をクリックします。
新しい顧客インデックス(インデックス)を作成する
PUT / {index-name} / _ doc / {id}
PUT /customer/_doc/1
{
"name": "John Doe"
}
put
HTTPメソッド、索引が存在しない場合(インデックス)ESはであるcustomer
ものを作成して、データを挿入、id
に,
名前= John`。
そこが更新されます。アップデートが更新されていることを注意は何体のJSONでカバレッジが、最終結果はなに。
戻り値は次のとおりです。
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 7,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 6,
"_primary_term" : 1
}
_index
インデックス名です_type
のみ_doc
_id
ドキュメントの主キー、つまりレコードのpkです_version
_id
更新数です、ここで7回更新しました_shards
シャーディングの結果を表します。ここでは合計2つのノードをデプロイしており、両方とも正常に書き込まれています。
インデックスのステータスは、kibanaの-index管理で確認できます。たとえば、レコードには2つのメインシャードと2つのシャードがあります。
レコードが正常に保存されたら、すぐに読み取ることができます。
GET /customer/_doc/1
戻る
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 15,
"_seq_no" : 14,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "John Doe"
}
}
_source
記録するのは
一括挿入
挿入するデータが複数ある場合は、まとめて挿入し、準備した文書をダウンロードして、HTTPリクエストでインポートします。
インデックスバンクを作成する:シャード(シャード)とレプリカ(レプリカ)は作成後に変更できないため、最初に作成するときにシャードを構成します。3つのシャードと2つのレプリカがあります。
PUT /bank
{
"settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "2"
}
}
}
ドキュメントアドレス:https : //gitee.com/mirrors/elasticsearch/raw/master/docs/src/test/resources/accounts.json
ダウンロード後、curlコマンドまたはpostmanがファイル要求を送信します
curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk?pretty&refresh" --data-binary "@accounts.json"
curl "localhost:9200/_cat/indices?v"
各レコードの形式は次のとおりです。
{
"_index": "bank",
"_type": "_doc",
"_id": "1",
"_version": 1,
"_score": 0,
"_source": {
"account_number": 1,
"balance": 39225,
"firstname": "Amber",
"lastname": "Duke",
"age": 32,
"gender": "M",
"address": "880 Holmes Lane",
"employer": "Pyrami",
"email": "[email protected]",
"city": "Brogan",
"state": "IL"
}
}
キバナモニターでセルフモニターを選択し、インデックスでインデックスバンクを見つけます。インポートしたデータの分布を確認できます。
ご覧のとおり、異なるノードに3つのシャードがあり、2つのレプリカがあります。
クエリを開始
データをバッチで挿入した後、クエリの学習を開始できます。前述のとおり、データは銀行の従業員テーブルです。すべてのユーザーにクエリを実行し、アカウント番号に従って並べ替えます。
sqlに似ています
select * from bank order by account_number asc limit 3
DSLのクエリ
GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" }
],
"size": 3,
"from": 2
}
_search
エクスプレスクエリquery
クエリ条件です、ここにすべてがありますsize
各クエリの数、ページ数を表します。送信されない場合、デフォルトは10です。返される結果にhits
表示されます。from
どの番号から示す
返品:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1000,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "2",
"_score" : null,
"_source" : {
"account_number" : 2,
"balance" : 28838,
"firstname" : "Roberta",
"lastname" : "Bender",
"age" : 22,
"gender" : "F",
"address" : "560 Kingsway Place",
"employer" : "Chillium",
"email" : "[email protected]",
"city" : "Bennett",
"state" : "LA"
},
"sort" : [
2
]
},
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "3",
"_score" : null,
"_source" : {
"account_number" : 3,
"balance" : 44947,
"firstname" : "Levine",
"lastname" : "Burks",
"age" : 26,
"gender" : "F",
"address" : "328 Wilson Avenue",
"employer" : "Amtap",
"email" : "[email protected]",
"city" : "Cochranville",
"state" : "HI"
},
"sort" : [
3
]
},
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "4",
"_score" : null,
"_source" : {
"account_number" : 4,
"balance" : 27658,
"firstname" : "Rodriquez",
"lastname" : "Flores",
"age" : 31,
"gender" : "F",
"address" : "986 Wyckoff Avenue",
"employer" : "Tourmania",
"email" : "[email protected]",
"city" : "Eastvale",
"state" : "HI"
},
"sort" : [
4
]
}
]
}
}
返された結果は次の情報を提供します
took
クエリ時間、単位はミリ秒timed_out
検索がタイムアウトしたかどうか_shards
検索した量、shards
成功した量、失敗した量、スキップした量です。シャードについては、データシャーディングと簡単に理解できます。つまり、インデックス内のデータはいくつかの部分に分割され、IDで分割されたテーブルとして理解できます。max_score
最も関連性の高いドキュメントのスコア
次に、条件付きクエリを試すことができます。
単語検索
アドレスをmill
合計lane
してアドレスを問い合わせます。
GET /bank/_search
{
"query": { "match": { "address": "mill lane" } },
"size": 2
}
戻る
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 19,
"relation" : "eq"
},
"max_score" : 9.507477,
"hits" : [
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "136",
"_score" : 9.507477,
"_source" : {
"account_number" : 136,
"balance" : 45801,
"firstname" : "Winnie",
"lastname" : "Holland",
"age" : 38,
"gender" : "M",
"address" : "198 Mill Lane",
"employer" : "Neteria",
"email" : "[email protected]",
"city" : "Urie",
"state" : "IL"
}
},
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "970",
"_score" : 5.4032025,
"_source" : {
"account_number" : 970,
"balance" : 19648,
"firstname" : "Forbes",
"lastname" : "Wallace",
"age" : 28,
"gender" : "M",
"address" : "990 Mill Road",
"employer" : "Pheast",
"email" : "[email protected]",
"city" : "Lopezo",
"state" : "AK"
}
}
]
}
}
- 私は2を返すように設定しましたが、実際には19をヒットしました
完全一致クエリ
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}
現時点では、完全に一致するものは1つだけです。
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 9.507477,
"hits" : [
{
"_index" : "bank",
"_type" : "_doc",
"_id" : "136",
"_score" : 9.507477,
"_source" : {
"account_number" : 136,
"balance" : 45801,
"firstname" : "Winnie",
"lastname" : "Holland",
"age" : 38,
"gender" : "M",
"address" : "198 Mill Lane",
"employer" : "Neteria",
"email" : "[email protected]",
"city" : "Urie",
"state" : "IL"
}
}
]
}
}
複数条件クエリ
実際のクエリでは、通常、複数の条件が一緒にクエリされます
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}
bool
複数のクエリ条件を組み合わせるために使用されますmust
、should
、must_not
サブステートメントブールクエリですmust
、should
デフォルトのソートの結果に応じて、スコア、関連性スコアを決定must not
クエリの結果に影響を与えるフィルターとして使用されますが、スコアには影響せず、結果からフィルターするだけです。
フィルターを明示的に指定して、構造化データに基づいてドキュメントを含めたり除外したりすることもできます。
たとえば、20,000と30,000の間の残高をクエリします。
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
集計操作グループ
州ごとの統計
sqlの表現によれば、
select state AS group_by_state, count(*) from tbl_bank limit 3;
esに対応するリクエストは
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword",
"size": 3
}
}
}
}
size=0
返されるコンテンツを制限することです。esはクエリレコードを返すため、値を集計するだけです。aggs
集約された文法的な単語ですgroup_by_state
集計結果であり、名前はカスタマイズされていますterms
クエリのフィールドは完全に一致します。ここにグループ化する必要があるフィールドがありますstate.keyword
状態はtext
タイプです。文字タイプには統計とグループ化が必要です。タイプはキーワードでなければなりませんsize=3
グループごとに返される数を制限します。ここではtop3、デフォルトはtop10、システムの最大値は10000です。変更によって実現できます。search.max_buckets
複数のシャードが精度の問題を引き起こし、後で詳しく学習します。
戻り値:
{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1000,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"group_by_state" : {
"doc_count_error_upper_bound" : 26,
"sum_other_doc_count" : 928,
"buckets" : [
{
"key" : "MD",
"doc_count" : 28
},
{
"key" : "ID",
"doc_count" : 23
},
{
"key" : "TX",
"doc_count" : 21
}
]
}
}
}
hits
クエリ条件のレコードにヒットします[]
。サイズ= 0が設定されているため、が返されます。total
このクエリは1000レコードにヒットしましたaggregations
集計指標結果ですgroup_by_state
クエリで指定された変数名ですdoc_count_error_upper_bound
この集計で返される可能性のある集計結果はありませんが、可能性のある集計結果がある可能性があります。キー名は「上限」を意味します。つまり、最終結果の値は、推定の最悪のケースでは計算されません。もちろん、doc_count_error_upper_boundの値値が大きいほど、最終的なデータが不正確になる可能性が高くなります。その値は0であると判断できます。これは、データが完全に正しいことを示しますが、0ではないということは、集約されたデータが間違っていることを意味しません。sum_other_doc_count
集計でカウントされなかったドキュメントの数
top3が正確であることは注目に値します。数値がdoc_count_error_upper_bound
間違っている、つまり統計結果が不正確である可能性が高く、取得されたtop3が28、23、21であることがわかります。比較する別のクエリパラメーターを追加します結果:
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword",
"size": 3,
"shard_size": 60
}
}
}
}
-----------------------------------------
"aggregations" : {
"group_by_state" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 915,
"buckets" : [
{
"key" : "TX",
"doc_count" : 30
},
{
"key" : "MD",
"doc_count" : 28
},
{
"key" : "ID",
"doc_count" : 27
}
]
}
}
shard_size
各シャードの計算数を表します。agg集計操作は各シャードの結果を計算し、最終的な結果を集計します。データはシャード内で不均一に分散され、各シャードのtopNは同じではありません。最終的な集計結果が少し少ない可能性があります。そのためdoc_count_error_upper_bound
、0 ではありません。es のデフォルトshard_size
値はsize*1.5+10
、size = 3が14.5に対応し、shar_size = 14.5の場合の戻り値が実際に渡されない場合と同じであることを確認します。60に設定すると、エラーは最終的にこれは0であり、つまり、これらの3が確実に最上位3であることを保証できます。つまり、集約操作では、shard_sizeをできるだけ大きく(サイズの20倍など)設定する必要があります。
州ごとに人数を数え、平均給与を計算します
各州の平均給与を確認したいのですが、sqlは
select
state, avg(balance) AS average_balance, count(*) AS group_by_state
from tbl_bank
group by state
limit 3
次のようにesでクエリを実行できます。
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword",
"size": 3,
"shard_size": 60
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
},
"sum_balance": {
"sum": {
"field": "balance"
}
}
}
}
}
}
- 2つ目
aggs
は、各州の集計インデックスを計算することです average_balance
カスタム変数名、値は同じ状態のバランスavg
操作ですsum_balance
カスタム変数名、値は同じ状態のバランスsum
操作です
結果は次のとおりです。
{
"took" : 12,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1000,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"group_by_state" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 915,
"buckets" : [
{
"key" : "TX",
"doc_count" : 30,
"sum_balance" : {
"value" : 782199.0
},
"average_balance" : {
"value" : 26073.3
}
},
{
"key" : "MD",
"doc_count" : 28,
"sum_balance" : {
"value" : 732523.0
},
"average_balance" : {
"value" : 26161.535714285714
}
},
{
"key" : "ID",
"doc_count" : 27,
"sum_balance" : {
"value" : 657957.0
},
"average_balance" : {
"value" : 24368.777777777777
}
}
]
}
}
}
州別の統計と平均給与で並べ替え
agg用語のデフォルトの順序はcountの降順です。他のメソッドを使用する場合、SQLは次のようになります。
select
state, avg(balance) AS average_balance, count(*) AS group_by_state
from tbl_bank
group by state
order by average_balance
limit 3
対応するesは次のように照会できます。
GET /bank/_search
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword",
"order": {
"average_balance": "desc"
},
"size": 3
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
top3が返す結果は前のものではありません。
"aggregations" : {
"group_by_state" : {
"doc_count_error_upper_bound" : -1,
"sum_other_doc_count" : 983,
"buckets" : [
{
"key" : "DE",
"doc_count" : 2,
"average_balance" : {
"value" : 39040.5
}
},
{
"key" : "RI",
"doc_count" : 5,
"average_balance" : {
"value" : 36035.4
}
},
{
"key" : "NE",
"doc_count" : 10,
"average_balance" : {
"value" : 35648.8
}
}
]
}
}
参考資料
- 中国語コミュニティ:https : //elasticsearch.cn/
- es公式ドキュメント:https : //www.elastic.co/guide/en/elasticsearch/reference/current/documents-indices.html
- es公式ドキュメント:https : //www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-index.html
- 用語の集計計算が不正確です:https : //www.dongwm.com/post/elasticsearch-terms-agg-is-not-accurate/