elasticsearch6.x公式ドキュメント学習ノート---Getting Started

14810 ワード

Getting Started
ここでは、主に次の操作について説明します.
1)基本概念.
2)インデックスの基本操作.
3)クエリー操作,filter操作,集計操作.
基本概念
1)準リアルタイム:ES検索はリアルタイムに近い検索プラットフォームである.これは、ドキュメントをインデックスする時間から検索できる時間まで、わずかな遅延(通常は1秒)があることを意味します.
2)クラスタ:ESはクラスタであり、1つのクラスタはidを一意の名前で識別し、デフォルトでは「elasticsearch」である.
3)ノード:ノードは個別のサーバであり、クラスタの一部であり、データを格納し、クラスタのインデックスと検索機能に参加し、クラスタidを介して正確なクラスタを追加します.
4)index:インデックスは類似の特徴を持つドキュメントの集合である.
5)type:インデックス用の論理分類/パーティションのタイプで、同じインデックスに異なるタイプのドキュメントを格納し、ユーザーに提供するタイプと、ブログ用のタイプがあります.
6)document:ドキュメントはインデックス可能な基本情報ユニットである.たとえば、単一の顧客に1つのドキュメント、1つの製品の別のドキュメント、もう1つの受注を提供できます.この文書はJSON(JavaScriptオブジェクト表示法)で表されており、どこにでもあるネットワークデータ交換形式である.
7)Shards&Replicas:インデックスは異なるノードに格納され、各スライスにはコピーがあり、スライスはインデックスの作成時にスライスとコピーの数を指定できます.
インストール
スキップ
elasticsearch-headをインストールしてwebでESの情報を表示できます.スキップ
操作ES
1)クラスタの状態を表示する:
curl -XGET 'http://mini1:9200/_cat/health?v

結果:
epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1475247709 17:01:49  elasticsearch green           1         1      0   0    0    0        0             0                  -                100.0%

statusの結果は3つに分けられます.
グリーン-すべてが優れています(クラスタ機能がそろっています)
黄色:すべてのデータは使用可能ですが、一部のコピーはまだ割り当てられていません(クラスタは完全に機能しています)
赤-何らかの理由で使用できないデータもあります(クラスタ部分機能)
2):すべてのインデックスを表示
curl -XGET 'http://mini1:9200/_cat/indices?v'

結果:
health status index                pri rep docs.count docs.deleted store.size pri.store.size 
green  open   store                  5   1          3            0     23.4kb         11.7kb 
green  open   .kibana                1   1          2            1     25.2kb         12.6kb 
green  open   gorktest1-2018.09.16   5   1        405            0      908kb          454kb 

3)索引の作成:
curl -XPUT 'http://mini1:9200/store'

4)データの挿入:
http://localhost:9200///[]index、typeは必須です.idはオプションで、esを提供しないと自動的に生成されます.index、typeは情報を階層化し、管理しやすい.indexはデータベースとして理解できます.typeはデータテーブルとして理解される.idはデータベーステーブルに記録されたプライマリ・キーに相当し、一意である.
#storeインデックスに書籍を追加
curl -XPUT 'http://mini1:9200/store/books/1' -d '{
  "title": "Elasticsearch: The Definitive Guide",
  "name" : {
    "first" : "Zachary",
    "last" : "Tong"
  },
  "publish_date":"2015-02-06",
  "price":"49.99"
}'

5)クエリー:
curl -XGET 'http://mini1:9200/store/books/1?pretty'

結果を返します.
{
  "_index" : "store",
  "_type" : "books",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "title" : "Elasticsearch: The Definitive Guide",
    "name" : {
      "first" : "Zachary",
      "last" : "Tong"
    },
    "publish_date" : "2015-02-06",
    "price" : "49.99"
  }
}

6)削除:
curl -XDELETE 'http://mini1:9200/store?pretty'

7)修正:
curl -XPOST 'http://mini1:9200/store/books/1/_update?pretty' -d '{
  "doc": {
     "price" : 88.88
  }
}'

8)一括操作:
個々のドキュメントをインデックス、更新、削除できるほか、Elasticsearchでは_bulk APIは、上記の任意の操作を一括して実行します.この機能は、可能な限り少ないネットワーク往復で可能な限り迅速に複数の操作を実行できる非常に有効なメカニズムを提供するため、非常に重要である.
#      
curl -XPUT 'http://mini1:9200/store/books/2' -d '{
  "title": "Elasticsearch Blueprints",
  "name" : {
    "first" : "Vineeth",
    "last" : "Mohan"
  },
  "publish_date":"2015-06-06",
  "price":"35.99"
}'

一括更新:
curl -XPOST 'http://mini1:9200/store/books/_bulk' -d '
	{"index":{"_id":"1"}}
	{"price": 10.99 }
	{"index":{"_id":"2"}}
	{"price": "111.22" }
'

クエリー操作
URL方式:
curl -XGET 'http://mini1:9200/store/books/_search?q=*&sort=price:asc&pretty'

解析:
q=*パラメータは、Elasticsearchがインデックス内のすべてのドキュメントに一致することを示します.sort=price:ascパラメータは、各ドキュメントのpriceフィールドを使用して結果を昇順にソートすることを示します.prettyのパラメータはElasticsearchにきれいなJSON結果を返すように伝えるだけです.
結果を返します.
{
  "took" : 19,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : null,
    "hits" : [ {
      "_index" : "store",
      "_type" : "books",
      "_id" : "1",
      "_score" : null,
      "_source" : {
        "price" : 10.99
      },
      "sort" : [ "10.99" ]
    }, {
      "_index" : "store",
      "_type" : "books",
      "_id" : "2",
      "_score" : null,
      "_source" : {
        "price" : "111.22"
      },
      "sort" : [ "111.22" ]
    } ]
  }
}

解析:
  • took–Elasticsearchを検索する時間はミリ秒単位
  • です.
  • timed_out–検索がタイムアウトしたかどうかを示す
  • _shards–フラグメントの検索に成功/失敗した回数を示す
  • hits–検索結果
  • hits.total–検索条件に一致するファイルの合計数
  • hits.hits–実際の検索結果配列(デフォルトでは上位10ドキュメント)
  • hits.sort-結果のソートキー(スコアでソートすると失われる)
  • hits._score  and  max_score  - ignore these fields for now

  • JSON方式:
    curl -XGET 'http://mini1:9200/store/books/_search?pretty' -d'
    {
      "query": { "match_all": {} },
      "sort": [
        { "price": "asc" }
      ]
    }'

    解析:
    上記の内容をよく分析すると、queryセクションではクエリー定義を教えてくれます.match_allセクションは、実行したいクエリーのタイプにすぎません.match_allクエリーは、指定したインデックスですべてのドキュメントを検索し、sortがどのフィールドに従ってどのような(desc、asc)ソートを行うかを検索します.
    curl -X GET "localhost:9200/store/_search"  -d'
    {
      "query": { "match_all": {} },
      "from": 10,
      "size": 10
    }
    '

    解析:
    fromパラメータ(0ベース)は、どのドキュメントインデックスから開始するかを指定し、sizeパラメータはfromパラメータからどのドキュメントを返すかを指定します.この特性は,検索結果のページングを実現する際に非常に有用である.ただし、fromが指定されていない場合は、デフォルトは0です.
    クエリーの実行:
    いくつかの基本的な検索パラメータを理解した以上、クエリーDSLをさらに検討しましょう.まず、返されるドキュメントフィールドを見てみましょう.デフォルトでは、完全なJSONドキュメントはすべての検索の一部として返されます.これをソースと呼びます(ヒットした_sourceフィールドを検索します).ソースドキュメント全体を返さない場合は、ソースドキュメントからいくつかのフィールドだけを要求して返すことができます.
    curl -X GET "http://mini1:9200/store/_search?pretty"  -d'
    {
      "query": { "match_all": {} },
      "_source": ["name.first", "price"]
    }
    '

    sql文は次のように理解されます.
    select first,price from books 

    match query:
    curl -X GET "http://mini1:9200/store/_search?pretty"  -d'
    {
      "query": { "match": { "price": "111.22" } }
    }'
    

    解析:
    match queryの新しいクエリーは、基本的なフィールド検索クエリー(すなわち、特定のフィールドまたはフィールドセットに対する検索)と見なすことができます.あいまいなクエリー.
    sql文は次のように理解されます.
    select price form books where price like %"111.22"%

    次は直接公式サイトを見ました.
    この例では、アドレスにmillまたはlaneが含まれているすべてのアカウントを返します.
    curl -X GET "localhost:9200/bank/_search"  -d'
    {
      "query": { "match": { "address": "mill lane" } }
    }
    '
    

    この例はmatch(match_phrase)の変形であり、アドレスに「mill lane」というフレーズが含まれているすべてのアカウントを返します.
    curl -X GET "localhost:9200/bank/_search"  -d'
    {
      "query": { "match_phrase": { "address": "mill lane" } }
    }
    '
    

    boolクエリー:
    この例では、2つの一致するクエリーが含まれ、アドレスに「mill」と「lane」が含まれているすべてのアカウントを返します.
    curl -X GET "localhost:9200/bank/_search"  -d'
    {
      "query": {
        "bool": {
          "must": [
            { "match": { "address": "mill" } },
            { "match": { "address": "lane" } }
          ]
        }
      }
    }
    '
    

    上記の例では、bool must句は、ドキュメントを一致と見なすためにtrueである必要があるすべてのクエリーを指定します.mustは論理と操作に相当する&.
    これに対して、この例では2つの一致するクエリーが含まれ、アドレスにmillまたはlaneが含まれているすべてのアカウントを返します.
    curl -X GET "localhost:9200/bank/_search"  -d'
    {
      "query": {
        "bool": {
          "should": [
            { "match": { "address": "mill" } },
            { "match": { "address": "lane" } }
          ]
        }
      }
    }
    '
    

    この例では、2つの一致するクエリーを組み合わせて、アドレスにmillもlaneも含まれていないすべてのアカウントを返します.
    curl -X GET "localhost:9200/bank/_search"  -d'
    {
      "query": {
        "bool": {
          "must_not": [
            { "match": { "address": "mill" } },
            { "match": { "address": "lane" } }
          ]
        }
      }
    }
    '
    

    This example returns all accounts of anybody who is 40 years old but doesn’t live in ID(aho):
    curl -X GET "localhost:9200/bank/_search"  -d'
    {
      "query": {
        "bool": {
          "must": [
            { "match": { "age": "40" } }
          ],
          "must_not": [
            { "match": { "state": "ID" } }
          ]
        }
      }
    }
    '
    

    フィルタ操作:
    filterは主に多くのデータをフィルタリングし、クエリー時間を短縮します.能率を高める.
    前のセクションで説明したboolクエリーでは、スコアの計算方法を変更することなく、クエリーを使用して他の句で一致するドキュメントを制限するfilter句もサポートされています.例としてrangeクエリーを導入し、一連の値でドキュメントをフィルタできます.これは、通常、数値または日付フィルタに使用されます.
    この例では、boolクエリを使用して、20000~30000の残高を持つすべての勘定科目(を含む)を返します.言い換えれば、私たちが見つけたい口座残高は20000以上、30000以下です.
    curl -X GET "localhost:9200/bank/_search"  -d'
    {
      "query": {
        "bool": {
          "must": { "match_all": {} },
          "filter": {
            "range": {
              "balance": {
                "gte": 20000,
                "lte": 30000
              }
            }
          }
        }
      }
    }
    '
    

    sql文は次のとおりです.
    select * from bank where balance>=20000 and balance<=30000

    集約アクション:
    この例では、すべての勘定科目をステータス別にグループ化し、カウントダウン順の最初の10(デフォルト)のステータスを返します.
    curl -X GET "localhost:9200/bank/_search"  -d'
    {
      "size": 0,
      "aggs": {
        "group_by_state": {
          "terms": {
            "field": "state.keyword"
          }
        }
      }
    }
    '

    sql:
    SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC LIMIT 10;

    結果(部分)を返します.
    {
      "took": 29,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped" : 0,
        "failed": 0
      },
      "hits" : {
        "total" : 1000,
        "max_score" : 0.0,
        "hits" : [ ]
      },
      "aggregations" : {
        "group_by_state" : {
          "doc_count_error_upper_bound": 20,
          "sum_other_doc_count": 770,
          "buckets" : [ {
            "key" : "ID",
            "doc_count" : 27
          }, {
            "key" : "TX",
            "doc_count" : 27
          }, {
            "key" : "AL",
            "doc_count" : 25
          }, {
            "key" : "MD",
            "doc_count" : 25
          }, {
            "key" : "TN",
            "doc_count" : 23
          }, {
            "key" : "MA",
            "doc_count" : 21
          }, {
            "key" : "NC",
            "doc_count" : 21
          }, {
            "key" : "ND",
            "doc_count" : 21
          }, {
            "key" : "ME",
            "doc_count" : 20
          }, {
            "key" : "MO",
            "doc_count" : 20
          } ]
        }
      }
    }

    なお、size=0は、レスポンス内の集約結果のみを表示したいため、検索結果を表示しないように設定します.
    前述の集約に基づいて、この例ではstatによって平均勘定科目残高を計算します(同様に、カウントダウン順にソートされた上位10ステータスのみ).
    curl -X GET "localhost:9200/bank/_search"  -d'
    {
      "size": 0,
      "aggs": {
        "group_by_state": {
          "terms": {
            "field": "state.keyword"
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
    '
    

    averageをどうするかに注意してください.balance集約はgroup_にネストされますby_state重合中.これはすべての集約の一般的なモードです.
    Building on the previous aggregation, let’s now sort on the average balance in descending order:
    curl -X GET "localhost:9200/bank/_search" -H 'Content-Type: application/json' -d'
    {
      "size": 0,
      "aggs": {
        "group_by_state": {
          "terms": {
            "field": "state.keyword",
            "order": {
              "average_balance": "desc"
            }
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
    '
    

    この例は、年齢等級(20-29歳、30-39歳、40-49歳)に基づいてグループ化し、性別に基づいて平均口座残高、年齢等級、性別を最終的に得る方法を示しています.
    curl -X GET "localhost:9200/bank/_search" -H 'Content-Type: application/json' -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.keyword"
              },
              "aggs": {
                "average_balance": {
                  "avg": {
                    "field": "balance"
                  }
                }
              }
            }
          }
        }
      }
    }
    '
    

     
    ok.....Getting Startedが終わって、ESに対して大体の認識があって、明日引き続き更新して、ドキュメント、まだ1時間半の車に乗って家に帰って、つらいです.