Elasticsearch7.6スタディノート1 Elasticsearchの使用開始

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"
}

putHTTPメソッド、索引が存在しない場合(インデックス)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複数のクエリ条件を組み合わせるために使用されます
  • mustshouldmust_notサブステートメントブールクエリですmustshouldデフォルトのソートの結果に応じて、スコア、関連性スコアを決定
  • 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
          }
        }
      ]
    }
  }

参考資料

おすすめ

転載: www.cnblogs.com/woshimrf/p/es7-start.html