iimon TECH BLOG

iimonエンジニアが得られた経験や知識を共有して世の中をイイモンにしていくためのブログです

Elasticsearchについて

こんにちは、iimonのデッサンです。

本記事はiimonアドベントカレンダー25日目の記事となります。

メリークリスマス!

会社ではフロントエンドに挑戦させてもらっていますが、 関係のないElasticsearchについての記事になります。

Elasticserachとは

  • 全文検索: Elasticsearchは、大量のテキストデータを高速に検索することができます。これにより、文書、ログ、ウェブページなどのテキストデータの索引付けや検索が容易になります。

  • JSON形式のドキュメント: ElasticsearchはJSON形式でドキュメントを格納します。これにより、柔軟なデータ構造を扱うことができる。

  • 多彩なクエリ機能: Elasticsearchは、複雑なクエリや絞り込み条件を使用してデータを検索できます。フルテキスト検索や範囲検索、複雑なフィルタリングが可能。

  • リアルタイム検索: データが追加または変更されると、リアルタイムで検索結果が更新されます。これにより、最新のデータを素早く検索できる。

検索方法について

Elasticsearchのクエリは、JSON形式で構築されています。

1. 単純なテキスト検索(match)

matchを使用して、指定したフィールドに対して単語を検索します。

GET _search
{
  "query": {
    "match": {
      "field_name": "search_text"
    }
  }
}

2. 範囲クエリ(range)

特定の範囲内の値を検索するためにrangeを使用します。

キー名はSQLの場合以下になります。

SQL Elasticsearch
> gt
>= gte
< lt
<= lte
GET _search
{
  "query": {
    "range": {
      "field_name": {
        "gte": 10,
        "lte": 100
      }
    }
  }
}

3. 検索結果のフィルタリング(filter)

filterを使用して、検索結果をフィルタリングできます。 検索結果から計算されるスコア(score)を計算しない。

GET _search
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "field1": "value1" } },
        { "range": { "field2": { "gte": 10 } } }
      ]
    }
  }
}

4. 複数の条件(bool)

boolを使用して、複数の条件を組み合わせ AND条件、OR条件、NOT条件ができます。 検索結果から計算されるスコア(score)を計算します。

SQL Elasticsearch
AND must
OR should
NOT must_not
  • AND条件(mustを使用)
GET _search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "field1": "value1" } },
        { "range": { "field2": { "gte": 10, "lte": 20 } } }
      ]
    }
  }
}
  • OR条件(shouldを使用)
GET _search
{
  "query": {
    "bool": {
      "should": [
        { "term": { "field3": "value3" } }
      ]
    }
  }
}
  • NOT条件(must_notを使用)
GET _search
{
  "query": {
    "bool": {
      "must_not": [
        { "exists": { "field": "field4" } }
      ]
    }
  }
}

5.結果のソート(sort)

sortを使用して、検索結果を特定のフィールドで昇順または降順にソートできます

GET _search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    { "field_name": { "order": "asc" } }
  ]
}

検索結果から計算されるスコア(score)について

Elasticsearchのスコア(relevance score)は、検索結果のランキングを決定するための値です。 スコアが高いほど、一致度が高いと見なし上位にランク付けされます。

  • 検索
GET _search
{
  "query": {
    "match": {
      "field_name": "search_text"
    }
  }
}
  • クエリ結果
{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "max_score": 0.98765,
    "hits": [
      {
        "_index": "hoge_index",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.98765,
        "_source": {
          "field_name": "search_text"
        }
      },
      {
        "_index": "hoge_index",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.87654,
        "_source": {
          "field_name": "another_text"
        }
      },
      {
        "_index": "hoge_index",
        "_type": "_doc",
        "_id": "3",
        "_score": 0.76543,
        "_source": {
          "field_name": "hoge_another_text"
        }
      }
    ]
  }
}

検索対象のキーfield_nameに対してsearch_textで検索をかけ より一致したデータから順にスコア(_score)の値が高くなっているのがわかります。

MySQLとの使い分け

Elasticsearchは、検索(特に全文検索)に特化しているため 大量にある商品の説明文の中から検索するといった用途に役立ちます。 よく使用される機能としては、大量レコード、データから瞬時に検索できるため サジェスト機能に使われる事が多く見受けられます。

最後に

次はDjangoを絡めて実際に登録したデータを全文検索するなどしてみたいです。

メリークリスマス!

参考

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

最後までご覧いただきありがとうございます。 弊社ではエンジニアを募集しております! この記事を見て気になった方、是非一度カジュアルにお話ししましょう! ご応募心よりお待ちしております!!!

Wantedly / Green