LoginSignup
6
5

More than 3 years have passed since last update.

【Elasticsearch入門】速習Elasticsearch Search query 基本クエリ(match, match_all)編

Last updated at Posted at 2020-07-24

ゴール

本記事ではElasticsearchの以下の基本操作の中のSearch queryの中の基本クエリ(match_all, match)を簡単に紹介します

  • CRUD
  • Search
    • query
      • 基本クエリ
        • match_all
        • match
        • match_phrase
        • multi_match
      • Termsクエリ
      • Boolクエリ
    • aggregation

Elasticsearch

Elasticsearch は オープンソースの全文検索エンジンです。
Apache LuceneをベースとしたJavaで書かれたソフトウェアでElastic社により開発が進められています。
登録したドキュメントから目的の単語を含むドキュメントを高速に検索することができます。
基本的にElasticsearchではRestful APIを使って操作します。

バージョン等

Elasticsearch: 7.6.2
kibana: 7.6.2
※ 簡単にSearch queryの操作を行うためにKibanaのDevToolsを使用します。

環境準備

環境に関しては以下の投稿に記載の通りで用意しています。
【Elasticsearch入門】環境構築
【Elasticsearch入門】環境構築 Windows編

準備

サンプルデータの用意をしていきます。
Kibanaの初期画面で「Add sample data」を選択してください。
image.png
以下の画面に遷移するので一番左の「Sample eCommerce orders」の「Add data」を押下してください。
image.png
そうするとサンプルデータが用意されます。
Dev Toolsに移動して以下のクエリを投げてください。

GET kibana_sample_data_ecommerce/_search

レスポンスによりデータがあることが確認できると思います。
今回はこちらのデータを使用して説明を行っていきます。

クエリの紹介

基本的なクエリ

まずはElasticsearchの検索で良く使用されるmatch_allmatchに関して説明していこうと思います。
これらのクエリには「対象のフィールドに対して全文検索を行う」と言った特徴があります。
つまり、基本的には単語分解して使用されるText型のフィールドに対して用いるものです。

それでは各クエリの説明に入っていきます。

match_all

match_allは必ず全件を返すクエリです。
一般的にはドキュメントの確認に用いられるものです。

GET /{index}/_search 
{
  "query": {
    "match_all": {}
  }
}


リクエスト

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "match_all": {}
  }
}

レスポンス

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4675,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "kibana_sample_data_ecommerce",
        "_type" : "_doc",
        "_id" : "iZ4NgHMBFnhBnJdY3gCP",
...

レスポンスをみるとkibana_sample_data_ecommerceのデータの全量が返ってくることがわかると思います。

match

matchは指定された語が含まれているかどうか、どれほどマッチしているかなどを判定して検索を行うクエリです。
ドキュメントの検索で最も使用されるクエリの一つです。
matchでは様々なオプションをつけることができるのでオプションも含めて説明していきます

一般的な形

GET /{index}/_search 
{
  "query": {
    "match": {
      "{field}": "{value}"
    }
  }
}


リクエスト

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "match": {
      "products.product_name": "white"
    }
  }
}

レスポンス

...
  "hits" : [
      {
        "_index" : "kibana_sample_data_ecommerce",
        "_type" : "_doc",
        "_id" : "lp4OgHMBFnhBnJdYEQsr",
        "_score" : 2.7853389,
        "_source" : {
          "category" : [
            "Men's Clothing"
          ],
          "currency" : "EUR",
          "customer_first_name" : "Phil",
          "customer_full_name" : "Phil Allison",
          "customer_gender" : "MALE",
          "customer_id" : 50,
          "customer_last_name" : "Allison",
          "customer_phone" : "",
          "day_of_week" : "Friday",
          "day_of_week_i" : 4,
          "email" : "phil@allison-family.zzz",
          "manufacturer" : [
            "Elitelligence",
            "Low Tide Media"
          ],
          "order_date" : "2020-07-31T23:44:10+00:00",
          "order_id" : 581315,
          "products" : [
            {
              "base_price" : 24.99,
              "discount_percentage" : 0,
              "quantity" : 1,
              "manufacturer" : "Elitelligence",
              "tax_amount" : 0,
              "product_id" : 18944,
              "category" : "Men's Clothing",
              "sku" : "ZO0524305243",
              "taxless_price" : 24.99,
              "unit_discount_amount" : 0,
              "min_price" : 11.5,
              "_id" : "sold_product_581315_18944",
              "discount_amount" : 0,
              "created_on" : "2016-12-23T23:44:10+00:00",
              "product_name" : "Shirt - white",
...

上記はレスポンス内にある一部の結果を示しています。products.product_nameをみてみるとwhiteが入っているドキュメントが返ってきているのがわかります。

OR検索

OR検索を行いたい場合、(つまり、複数語を指定してどれかが入っているという検索をしたい場合、)以下の通り、複数の検索ワードを指定することができます。

GET /{index}/_search 
{
  "query": {
    "match": {
      "{field}": "{value} {value2}"
    }
  }
}

検索ワードにwhite blackの両方を指定した場合は以下のようになります。

リクエスト

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "match": {
      "products.product_name": "white black"
    }
  }
}

レスポンス

...
    "hits" : [
      {
        "_index" : "kibana_sample_data_ecommerce",
        "_type" : "_doc",
        "_id" : "k54OgHMBFnhBnJdYEQsr",
        "_score" : 3.1972795,
        "_source" : {
          "category" : [
            "Women's Clothing"
          ],
          "currency" : "EUR",
          "customer_first_name" : "Diane",
          "customer_full_name" : "Diane Reese",
          "customer_gender" : "FEMALE",
          "customer_id" : 22,
          "customer_last_name" : "Reese",
          "customer_phone" : "",
          "day_of_week" : "Wednesday",
          "day_of_week_i" : 2,
          "email" : "diane@reese-family.zzz",
          "manufacturer" : [
            "Pyramidustries"
          ],
          "order_date" : "2020-07-29T05:19:41+00:00",
          "order_id" : 577614,
          "products" : [
            {
              "base_price" : 20.99,
              "discount_percentage" : 0,
              "quantity" : 1,
              "manufacturer" : "Pyramidustries",
              "tax_amount" : 0,
              "product_id" : 14551,
              "category" : "Women's Clothing",
              "sku" : "ZO0170501705",
              "taxless_price" : 20.99,
              "unit_discount_amount" : 0,
              "min_price" : 10.08,
              "_id" : "sold_product_577614_14551",
              "discount_amount" : 0,
              "created_on" : "2016-12-21T05:19:41+00:00",
              "product_name" : "Blouse - black/white",
...

上記はレスポンス内にある一部の結果を示しています。products.product_nameをみてみるとblack/whiteが入っているドキュメントが返ってきているのがわかります。
他の結果をみてみるとどちらかしか入っていないものもあるかと思います。
ただし、両方が含まれている場合、スコアが高くなるため、検索結果として上位に出てくるようになります。

AND検索

GET /{index}/_search 
{
  "query": {
    "match": {
      "{field}": {
         "query": "{value}",
         "operator": "and"
      }
    }
  }
}

検索ワードにblack shirtの両方を指定した場合は以下のようになります。

リクエスト

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "match": {
      "products.product_name": {
        "query": "black shirt",
        "operator": "and"
      }
    }
  }
}

レスポンス

...
             {
              "base_price" : 29.99,
              "discount_percentage" : 0,
              "quantity" : 1,
              "manufacturer" : "Low Tide Media",
              "tax_amount" : 0,
              "product_id" : 11599,
              "category" : "Men's Clothing",
              "sku" : "ZO0417004170",
              "taxless_price" : 29.99,
              "unit_discount_amount" : 0,
              "min_price" : 14.99,
              "_id" : "sold_product_553396_11599",
              "discount_amount" : 0,
              "created_on" : "2016-12-03T05:48:29+00:00",
              "product_name" : "Shirt - black",
...

上記はレスポンス内にある一部の結果を示しています。products.product_nameをみてみるとShirt blackが入っているドキュメントが返ってきているのがわかります。
このようにOperatorで指定することでAND検索を行うことができます。

minimum_should_match

上記でOR検索とAND検索を行いました。
これら二つを行うことができるようになると今度はその間のような検索を行いたくなるかと思います。
具体的には、3つの語のうち2つは一致してほしいといった要件です。
そういったときにminimum_should_matchを用います。

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "match": {
      "{field}": {
         "query": "{value1} {value2} {value3}",
        "minimum_should_match": N
      }
    }
  }
}

検索ワードにblack white shirtの最低2つの文字を検索でひっかけたい時の例を示していきます。


リクエスト

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "match": {
      "products.product_name": {
        "query": "black white shirt",
        "minimum_should_match": 2
      }
    }
  }
}

レスポンス

...
         {
              "base_price" : 24.99,
              "discount_percentage" : 0,
              "quantity" : 1,
              "manufacturer" : "Elitelligence",
              "tax_amount" : 0,
              "product_id" : 18944,
              "category" : "Men's Clothing",
              "sku" : "ZO0524305243",
              "taxless_price" : 24.99,
              "unit_discount_amount" : 0,
              "min_price" : 11.5,
              "_id" : "sold_product_581315_18944",
              "discount_amount" : 0,
              "created_on" : "2016-12-23T23:44:10+00:00",
              "product_name" : "Shirt - white",
...

上記はレスポンス内にある一部の結果を示しています。products.product_nameをみてみるとShirt whiteが入っているドキュメントが返ってきているのがわかります。
他の結果をみてみてもわかるとおり、最低2つの語が一致していることがわかります。

以上でmatch, match_allの解説を終わります。
次回は基本クエリの中のmatch_phrase, multi_matchを解説していきます。

おすすめ教材

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5