Elasticsearchユーザーガイドの基礎(2)

12392 ワード

バージョン5.0公式文書英語版
関連記事:
  • Elasticsearchユーザーズガイド一基礎(1)
  • 五、あなたのデータを閲覧する
    基礎を概説し、より実用的なデータセットを見てみましょう.ここには架空のユーザー銀行口座JSONドキュメントが用意されており、各ドキュメントは以下のような構造になっています.
    {
        "account_number": 0,
        "balance": 16623,
        "firstname": "Bradshaw",
        "lastname": "Mckenzie",
        "age": 29,
        "gender": "F",
        "address": "244 Columbus Place",
        "employer": "Euron",
        "email": "[email protected]",
        "city": "Hobucken",
        "state": "CO"
    }
    

    同時にbankインデックスが作成されます.
    5.1検索API
    簡単な検索を始めましょう.検索を実行するには2つの基本的な方法があります.
  • 通過REST request URI送信パラメータ
  • 通過REST request body送信パラメータ
  • request bodyメソッドでは、柔軟で直感的なJSONフォーマットで検索できます.REST request URIメソッドの検索例を試みますが、このドキュメントの残りの部分ではrequest body methodという方法しか使用されません.
    検索APIは_searchから始まり、次の例ではbankインデックス内のすべてのドキュメントを返します.
    GET /bank/_search?q=*&sort=account_number:asc&pretty
    

    この検索リクエストをよく分析しましょう.私たちはbankインデックスから検索し、q=*パラメータはElasticsearchにインデックス内のすべてのドキュメントを一致させるように指示します.sort=account_number:ascパラメータ表示使用文書中account_numberフィールドはasciiコード順に並べられている.prettyパラメータはElasticsearchにフォーマットの良いJSON結果を返すように伝えます.次のセクションでは、結果を返します.
    {
      "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"...}
        }, {
          "_index" : "bank",
          "_type" : "account",
          "_id" : "1",
          "sort": [1],
          "_score" : null,
          "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke"...}
        }, ...
        ]
      }
    }
    

    次に、返されるパラメータを示します.
  • tookElasticsearch検索実行時間(ミリ秒数)
  • timed_out検索がタイムアウトしたか
  • _shards複数のスライスが検索され、また成功/失敗した探索スライス数
  • hits検索結果
  • hits.total検索結果総数
  • hits.hits実際の検索結果(デフォルトは上位10文書)
  • sort並べ替え用の値(scoreで並べ替えた場合はこのパラメータなし)
  • _scoremax_score一時無視
  • 次の検索条件は、上の検索とまったく同じですが、request body methodを使用します.
    GET /bank/_search
    {
      "query": { "match_all": {} },
      "sort": [
        { "account_number": "asc" }
      ]
    }
    

    重要なのは、検索結果を受信すると、Elasticsearchが要求を完了し、サービス側のリソースを保持したり、結果にポインタを開いたりしないことです.
    5.2クエリー言語の紹介
    Elasticsearchは、クエリーを実行するためにドメイン固有のJSONスタイルの言語を提供します.このクエリー言語は非常に全面的で、最初の目で見ると少し怖いです.最も良い方法はいくつかの基本的な例から学ぶことです.
    前の例に戻って、次のクエリを実行します.
    GET /bank/_search
    {
      "query": { "match_all": {} }
    }
    
    query部分的に我々のクエリー定義を指定し、match_all部分的に我々がクエリーするタイプである、match_all指定したインデックスですべてのドキュメントをクエリーすることを示す.queryパラメータに加えて、クエリー結果に影響を与える別のパラメータを渡すこともできます.以前はsortパラメータを渡していましたが、ここではsize:
    GET /bank/_search
    {
      "query": { "match_all": {} },
      "size": 1
    }
    
    sizeクエリごとに返される結果の数を示し、ここでは1つの結果のみが返される.注意:size指定されていない場合、デフォルト値は10です.
    次の例では、すべての結果から11~20番目のドキュメントをクエリーします.
    GET /bank/_search
    {
      "query": { "match_all": {} },
      "from": 10,
      "size": 10
    }
    
    fromパラメータは0から始まり、そのドキュメントインデックスからクエリーを開始し、size個のドキュメントをクエリーすることを指定します.この特性はページングを実現するために使用することができる.from指定されていない場合、デフォルトは0です.
    5.3クエリーの実行
    基本的なクエリーパラメータをいくつか見て、Query DSLをもっと深く理解しましょう.検索で返される_sourceドメインを見てみると、デフォルトで検索されたドキュメント全体が結果の一部として返されます.ドキュメント全体が返されたくない場合は、ドキュメント内のリソースの一部だけを要求することができます.
    次の例は、account_numberおよびbalanceフィールドのみを返します.
    GET /bank/_search
    {
      "query": { "match_all": {} },
      "_source": ["account_number", "balance"]
    }
    

    こうして返された_sourceにはaccount_numberbalanceのデータしかありません.SQLのSELECTと同様の役割を果たす.
    以前はmatch_allを使用してすべてのドキュメントを検索しましたが、match queryについて学びます.
    次の例はaccount_をクエリーします.numberには20のドキュメントが含まれています.
    GET /bank/_search
    {
      "query": { "match": { "account_number": 20 } }
    }
    

    クエリー・アドレスにはmillのすべてのドキュメントがあります.
    GET /bank/_search
    {
      "query": { "match": { "address": "mill" } }
    }
    

    クエリー・アドレスには、「mill」または「lane」のすべてのドキュメントがあります.
    GET/bank/_search { "query": { "match": { "address": "mill lane"} } } match_phraseそうmatchの変種ですが、条件は全体(フレーズ)として、真ん中にスペースがある場合は条件として扱われません.アドレスに「mill lane」が含まれているドキュメントを調べます.
    GET /bank/_search
    {
      "query": { "match_phrase": { "address": "mill lane" } }
    }
    

    以下、bool(ean)queryについて説明します.bool queryでは、booleanロジックを使用して、いくつかの小さなクエリーを大きなクエリーに構成できます.
    次の例では、2つのmatchクエリーを組み合わせ、クエリー・アドレスには「mill」と「lane」のすべてのドキュメントが含まれています.
    GET /bank/_search
    {
      "query": {
        "bool": {
          "must": [
            { "match": { "address": "mill" } },
            { "match": { "address": "lane" } }
          ]
        }
      }
    }
    

    この例では、boolmust条件はすべて指定されているmatchクエリは、1つのドキュメントに対してtrueである必要がある場合に返されます.
    次の例では、2つのmatchクエリーを組み合わせて、クエリー・アドレスに「mill」または「lane」のすべてのドキュメントが含まれています.
    GET /bank/_search
    {
      "query": {
        "bool": {
          "should": [
            { "match": { "address": "mill" } },
            { "match": { "address": "lane" } }
          ]
        }
      }
    }
    

    この例では、boolmust条件がすべて指定されているmatchクエリは、1つのドキュメントに対してtrueである必要がある場合に返されます.
    次の例では、2つのmatchクエリーを組み合わせます.クエリー・アドレスには「mill」も「lane」も含まれていないドキュメントが含まれています.
    GET /bank/_search
    {
      "query": {
        "bool": {
          "must_not": [
            { "match": { "address": "mill" } },
            { "match": { "address": "lane" } }
          ]
        }
      }
    }
    

    これはmustと似ていますが、条件が逆です.must・、shouldと、must_not条件が1つboolクエリに含まれることができます.
    次の例では、年齢が40歳で、居住していないID(地名の略)を調べます.
    GET /bank/_search
    {
      "query": {
        "bool": {
          "must": [
            { "match": { "age": "40" } }
          ],
          "must_not": [
            { "match": { "state": "ID" } }
          ]
        }
      }
    }
    

    5.4実行フィルタ
    前の章ではdocument score(検索結果の_scoreフィールド)というフレーズをスキップしました.scoreは、指定した検索条件に対するドキュメントの一致の程度を示す数値タイプです.スコアが高いほど、このドキュメントは私たちの検索条件に合致します.
    ただし、クエリは毎回scoreを生成する必要はありません.特に、ドキュメントセットのみをフィルタする場合です.
    bool queryクエリーもサポートfilter条件です.一例としてrange queryを紹介します.これにより、ドキュメントセットを値の範囲でフィルタできます.通常、数値と日付フィルタとして使用されます.
    次の例では、bool queryを使用して、すべてのアカウント残高が20000以上30000以下のすべてのアカウントを返します.
    GET /bank/_search
    {
      "query": {
        "bool": {
          "must": { "match_all": {} },
          "filter": {
            "range": {
              "balance": {
                "gte": 20000,
                "lte": 30000
              }
            }
          }
        }
      }
    }
    

    ここでは、match_allmatchboolと、rangeクエリーについて説明しますが、ここでは引き続き説明しません.基本的な理解があれば、他のタイプのクエリーを学ぶのは難しくないはずです.
    5.5集約の実行
    集約は、分析をグループ化および抽出する能力を提供します.最も簡単な方法は、SQLのGROUP BYや他の集約関数クラスと比較することです.
    Elasticsearchでは、検索を実行してヒットを返す結果と集約結果を検索応答で同時に受信できます.これは、いくつかのシーンで複数のクエリーと複数の集約を実行し、1つの応答で両方の結果を同時に受信できる強力な機能であり、サーバ間のデータインタラクションの回数を低減します.
    すべてのアカウントを州ごとにグループ化し、一番上の10の州に戻り、グループごとに降順に並べ替えます(デフォルト).
    GET /bank/_search
    {
      "size": 0,
      "aggs": {
        "group_by_state": {
          "terms": {
            "field": "state.keyword"
          }
        }
      }
    }
    

    SQL文を使用する場合は、次のような文が使用されます.
    SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC
    

    次は、結果(部分)を返します.
    {
      "took": 29,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "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
          } ]
        }
      }
    }
    

    注意hitsの空いているのは、集約結果だけを見たいからです.
    前のクエリに基づいて、各州の口座の平均残高を計算します.
    GET /bank/_search
    {
      "size": 0,
      "aggs": {
        "group_by_state": {
          "terms": {
            "field": "state.keyword"
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
    
    group_by_stateにどのようにネストされているかaverage_balance集約されているかに注意してください.これはすべての集約の一般的なモードです.
    まず、上記のクエリで変更させてください.デフォルトはグループごとの数で降順に並べられています.次に、州ごとの残高で降順に並べます.
    GET /bank/_search
    {
      "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)し、性別別にグループ化し、最終的に各年齢層、男女の平均残高を計算する方法を示します.
    GET /bank/_search
    {
      "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"
                  }
                }
              }
            }
          }
        }
      }
    }
    

    重合の能力はaggregations reference guideを参照してください.
    このユーザーズガイドの開始部分で終わります.