オープンソース

Elasticsearch〜ビッグデータに対応した全文検索エンジン〜

Elasticsearchは、Apache Luceneをベースに開発された全文検索エンジンです。このページでは、Elasticsearchの特徴、Elasticsearchと周辺ツール、Elasticsearchに対するデージーネットの取り組みを紹介します。

Elasticsearchとは

Elasticsearchとは、ビッグデータに対応した全文検索エンジンで、オランダのElastic社が開発を行っています。Apache Luceneを基盤として開発されていて、オープンソースソフトウェアとして2010年に初めてのバージョンがリリースされました。RDBではSQLを使用してデータを検索しますがElasticsearchはRESTfulインターフェースを用いてデータを検索します。Elasticsearchは、検索速度や分析柔軟性に優れており、わかりやすく検索機能を利用でき、データ蓄積や分析環境を簡単に構築することができます。つまり、Elasticsearchは、数百台で構成するような大規模検索システム、ショッピングサイト等の多くの商品から関連する商品を検索するシステム等を構築することに適しています。

また、Elasticsearchは、情報の量に合せてスケーラブルにシステムを拡張できるため、ビッグデータの解析やIoTデータの解析等にも使われています。クラウドでサービスでは、AWSのAmazon Elasticsearch Service、AzureのElastic on Azureのようにサービス提供されていました。最近では、IoTデータの解析などの用途やドキュメントデータの解析のために、オンプレミスで利用することも増えています。

従来、Elasticsearchの基本部分は、オープンソースライセンスであるApache License 2.0にて提供されていました。しかし2021年2月リリースの7.11.0以降Server Side Public License (SSPL)とElastic License 2.0(ELv2)のデュアルライセンスに移行しました。

ELv2ライセンスでは、プログラムを使用したサービスを第三者に提供することは禁じられています。この制限によって、Elasticsearchはオープンソースソフトウェアではなくなってしまいました。

このライセンス変更の背景にはAWSが提供するAmazon Elasticsearch Serviceの存在がありました。
Amazon Elasticsearch ServiceではElasticsearchをユーザに使用させるクラウドサービスを提供していました。このようなサービスの提供を阻止するため、Elasticはライセンスの変更に踏み切りました。

その結果、2021年4月に、Amazon Web Serviceは、Elasticsearch 7.1.0.2からフォークしたOpenSearchプロジェクトを発表する記事を掲載しました。これにともない、AWS上のAmazon Elasticsearch ServiceはAmazon OpenSearch Serivceと名称変更されるということです。OpenSearchは、ElasticsearchとKibanaのコミュニティが主導するプロジェクトとして、Apache License Version 2の元でリリースされます。これによって、OpenSearchが、従来よりも様々なビジネスや製品などで利用しやすくなることが予想されます。

Elasticsearchの特徴

Elasticsearchの主な特徴は、次のとおりです。

  • ビッグデータ解析に対応可能な検索性能がある
  • 部分一致検索や近似値の検索が可能である。
  • スケーラビリティに優れている
  • シンプルな設計である
  • 分散処理に対応し、高可用性を考慮し設計されている
  • RESTful APIを採用している
  • HadoopやSPARKと組み合わせて利用できる
  • データの登録や解析のための周辺ツールが充実している

このようにElasticsearchには様々な特徴があります。以下では、Elasticsearchの特徴について詳しく紹介します。

Elasticsearchの部分一致検索

Elasticsearchでは、部分一致検索が可能です。
リレーショナルデータベースは検索条件に対し、完全一致した値を返します。それに対して、Elasticsearchでは、予め文字列を要素解析して保存するため、検索条件に対し近似した値も返すことができ、高速で動作します。

Elasticsearchの高速検索

Elasticsearchは、列指向のデータ管理、FST、BKD-Treeによって、少ないメモリで高速な検索を実現しています。

列指向のデータ管理

リレーショナルデータベースでは行指向でデータを管理するのに対して、Elasticsearchは列指向でデータを管理します。製品の名前、仕入価格、販売価格、在庫数を管理するデータベースから在庫数が少ないものを抽出する場合を例にとってみます。

従来の行指向のデータベースでは、一つ一つの製品ごとにデータが管理されています。各製品の行の中から、在庫数の項目を取り出して比較することになります。各製品の行の中から、在庫数の項目を取り出して比較することになります。一方、Elasticsearchの列指向のデータ管理の場合には、データは列ごとに管理されています。そのため、在庫データの列の中から条件に合致するものだけを取り出して、関連する製品の名前を調べることができます。そのため、このような用途では、行指向のデータベースよりも、列指向のデータベースの方が適しています。

Elasticsearchは、列指向でデータを管理するため、大量の情報の中から必要なデータを高速に検索することができるのです。

FST(Finite State Transducers)

さらに、Elasticsearchでは、テキストデータの管理にも高速な手法を採用しています。Elasticsearchは、Apache Luceneが採用しているFST(Finite State Transducers)と呼ばれる検索インデックスを踏襲しています。FSTは、自然言語処理で使われる手法で、自然言語処理とは、人間の言語を機械で処理し内容を抽出することをいいます。テキストの正規化や品詞分類などでも使われます。Elasticsearchは、FSTを採用することで、入力された文字列を正規化してインデックスします。

BKD-Tree

また、Elasticsearchでは、数値データの管理にも高速な手法を採用しています。Elasticsearchでは、数値データをBKD-Treeというアルゴリズムで管理します。BKD-Treeは、K-D-B-tree(K-dimensional B-tree)を改良したアルゴリズムです。B-treeは、コンピュータプログラムで検索を行う時によく使われる木構造のことです。K-D-B-treeは、それを多次元に拡張したアルゴリズムで、k次元のB-treeを意味しています。

Elasticsearchは、BKD-Treeを採用することで、多様な数値データを高速に検索することができるようになっています。

スキーマレス

Elasticsearchは、リレーショナルデータベースのようなスキーマを使わずに、データを登録することができます。データの型は自動的に判別されます。そのため、高速にデータの登録ができます。一方で、Elasticsearchでは追加で明示的にスキーマの定義を行うことも可能です。そして、適切にスキーマを定義することで、より高い検索性能を引き出すことができます。Elasticsearchでは、投入したデータに対して、事後的にスキーマの適用や修正を行うこともできます。

様々な検索クエリの実行が可能

Elasticsearchは、一般的には全文検索用データベースと考えられています。しかし、テキストだけでなく、数値、構造化データ、非構造化データ、地理情報などにも対応しています。

ElasticSearchでは、様々な検索クエリをサポートしています。次のような検索クエリの実行が可能です。

  • 部分一致検索(match)

    部分一致検索です。複数のキーワードを並べた場合にはOR検索します。

  • AND検索(bool)

    matchを使った複数の検索をAND条件で検索します。

  • フレーズ検索(match_phrase)

    空白を含む単語を検索します。

  • 重み付け(boost)

    複数のキーワードで検索する時に、検索時のパラメータとして重みを付けます。

  • 範囲指定(filter)

    範囲を指定して、該当するものだけを出力します。

  • 検索スコア(explain)

    検索結果にスコアつけて出力します。関連性の高さを調べることができます。

  • highlight

    検索に一致した部分に強調タグを付けて出力します。

データセキュリティ

Elasticsearchでは、ユーザーにアクセス権限を付与することができます。そして、ユーザーごとにデータベースへのアクセスを制限することが可能です。そのため、不正利用を防ぎ、安全にデータを管理することができます。また、マルチテナントのデータベースとして利用することもできます。

Elasticsearchの高可用性とスケーラビリティ

Elasticsearchは、論理構成と物理構成で成り立っています。それぞれの構成は以下の通りです。

論理構成

  • インデックス

    物理的なファイルに保存される単位。
    ドキュメントの集合体。Elasticsearchは、
    複数のインデックスをサポートしています。

  • タイプ

    インデックス内の区分。

  • ドキュメント

    タイプの設定から構成されるデータ群。

物理構成

  • クラスター

    ノードからなる集合体。
    Elasticsearch分散処理システムの一番上位の単位です。

  • ノード

    Elasticsearchのプロセス

  • シャード

    インデックスを物理的に分割管理する単位

論理構成と物理構成の相関関係は、次の図のようになっています。

Elasticsearchの論理構成と物理構成の相関関係

Elasticsearchでは、物理的なデータを複数のノードに分散し、シャードをレプリケーションすることで、データの冗長性を確保することができます。

Elasticsearchのデータ構造の例

このようにクラスタをノード単位で構成しているため、クラスタの構築が容易に行えます。クラスタ構成を組みたいネットワークを指定し、同一クラスタ名で起動するだけで容易にクラスタ構成を組むことができるのです。このため、mysqlなどのRDBよりも、dockerKubernetesのようなコンテナ環境で利用するにも適しています。また、大規模なデータの分散並列処理を行うHadoopなどとの連携が可能です。分散並列処理を行うことで大規模データの処理にも対応できます。

RESTful API

Elasticsearchの利用には、RESTful APIを使用します。RESTful APIは、次のようなRESTの原則にしたがって作られたAPIです。

  • サーバとクライアント間は、ステートレスなHTTP通信である
  • 統一メソッドを利用してリソース(情報)へアクセスする
  • リソースには、グローバルで一意なURIでアクセスする
  • リソースは、HTMLやXMLなどのハイパーメディアであり、他のリソースや状態へのリンクを含めることができる

最近では、多くのプログラミング言語にRESTを使うためのインタフェースが用意されています。これらのインタフェースを利用することで、プログラムの作成なども簡単に行うことができます。

次はcurlコマンドを使ってローカルのElasticsearchに接続し、検索クエリを行う実行例です。

$ curl -XGET 'http://localhost:9200/_search?pretty' -d ' ⏎
{"query": ⏎
  {"query_string": ⏎
    {
      "query": "ElasticsearchTestDesigNET" ⏎
    } ⏎
  } ⏎
}'⏎
{
  "took" : 66,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.7289374,
    "hits" : [ {
      "_index" : "2016-03-28",
      "_type" : "events",
      "_id" : "AVO5rswLhxlP6y_BGGQW",
      "_score" : 1.7289374,
      "_source" : {
        "message" : "ElasticsearchTestDesigNET",
        "host" : "elastic01",
        "severity" : "5",
        "date" : "2016-03-28T05:05:53.800",
        "tag" : "ohno:"
      }
    } ]
  }
}

Elasticsearchと周辺ツール

Elasticsearchの開発元であるElastic社は、Elasticsearchとともにいくつかのツールを提供しています。ここでは、Kibana、Logstash、Kuromojiとの連携について紹介します。

Kibana

ElasticsearchとKibanaの連携

Kibanaは、Elastic社が開発したログデータの可視化ツールです。Webブラウザ上で操作でき、Elasticsearchの検索機能を活用し、時系列でのデータ抽出や属性に合わせたデータ抽出を行います。そして、抽出したデータをグラフィカルに表示することができます。表やグラフなどの形式で分かりやすく表示できます。Kibanaは、非常に強力なログ解析ツールであり、リアルタイム分析やレポートの作成も可能です。

Kibanaには、ダッシュボード機能が付属しています。ダッシュボードは、用途に合わせてカスタマイズ可能です。そのため、適切なカスタマイズを行っておくことで、必要な情報にすぐにアクセスすることができます。

Logstash

Logstashは、様々な形式のデータを収集・変換し、任意の場所に保管することができるOSSです。Logstashを利用すると、ログファイルに溜まっているデータを解析して、データベースへ格納するなど、用途にあった形にデータを変換・保存することができます。

Logstashを使って様々なデータを取得・収集し、Elasticsearchに登録し、Kibanaを使って可視化することができます。

ElasticsearchとLogstashの連携

Kuromoji

Kuromojiは、Elasticsearchで日本語の解析を行う場合に利用されるオープンソースの日本語形態素解析エンジンです。Javaで書かれています。KuromojiはApache Software Foundationに寄付されていて、Apache Luceneへの日本語のサポートを提供しています。Kuromojiは、複合語の分割、品詞のタグ付け、見出し化、読みの抽出などの機能を提供します。

このように、他のソフトウェアを組み合わせることで、様々な用途や目的でElasticsearchを使うことができます。

OpenSearchとの互換性

OpenSearchは、Elasticsearch7.10.2をフォークして作成された全文検索エンジンです。しかし、ElasticsearchとOpenSearchとは一部互換性がなくなっています。そのため、OpenSearchへデータを投入したい場合は、投入するツールがOpenSearchに対応しているか確認する必要があります。

デージーネットの取り組み

デージーネットでは、今回ElasticsearchがOSSでなくなったことから、OpenSearchの調査検証を行いました。ElasticsearchとOpenSearchの互換性を検証し、OpenSearchを使ったログ管理システムや、Webやファイルサーバの全文検索システムなどを提案しています。OpenSearchと全文検索システムのFessを連携することで大容量のデータから必要なデータを素早くに取り出すことができます。全文検索システムFessのインストール方法や、詳細な情報は、調査報告書に掲載されています。調査報告書は無料資料ダウンロードからダウンロードすることが可能です。ここでは、関連事例や導入事例を紹介します。

大容量ログ解析システム

構築事例:Elasticsearchを使ったログ解析システム構築

デージーネットでは、大容量のログを管理するためのソフトウェアであるSylasを開発し、OSSとして公開しています。Sylasは、rsyslogと連携してログを取り込みます。Sylasの検索画面からログの検索を行うことができます。

DNSログ解析システム

構築事例:DNSキャッシュサーバの水責め攻撃対策

デージーネットでは、DNSサーバへの攻撃に対応するためのDNSログ解析システムを提案しています。DNSサーバから、dnstapなどのインタフェースを使ってクエリログを収集して登録します。収集されたログをKibanaを使って解析することで、攻撃の状況をリアルタイムに把握し、攻撃に対する防御を行うことができます。

ファイルサーバ全文検索システム

構築事例:Fessによるファイルサーバ検索システム

Elasticsearchは、ファイルサーバの全文検索のソリューションとしても利用できます。ファイルサーバへの全文検索を実現すれば、膨大なファイルの中から、必要なファイルを短時間で探し出すことができます。ファイルサーバの情報を管理するためには、ファイル情報を取り出して取り込むためのソフトウェアが必要です。デージーネットでは、そのようなソフトウェアとしてFessをご提案しています。Fessは、ファイルサーバを自動的にクロールし、ファイルの情報を取り出し登録します。

また、Fessには標準で検索インタフェースも付属しています。ファイルの更新日、名称、形式などから検索結果を絞り込むことも可能です。

サイト内検索システム

構築事例:Fessによるサイト内検索システム

Elasticsearchは、サイト内検索のソリューションとしても利用可能です。Webサイトの情報を管理するためには、Webサイトにアクセスし、情報を取り出して取り込むためのソフトウェアが必要です。デージーネットでは、そのようなソフトウェアとしてFessをご提案しています。Fessは、HTTPプロトコル経由でサイトを自動的にクロールし、情報を取り出して格納します。

また、サイトのデザインに合わせた専用の検索画面を作成することもできます。その場合には、RESTful APIを利用して、検索結果を表示するアプリケーションを作成します。なお、デージーネットのホームページでも、サイト内検索の機能を実装するためにこの仕組みを使っています。

さらに、Kibanaを連携させることで、サイト内検索の利用状況について分析することもできます。

コンサルティング

事例:Elasticsearchの性能改善

システムを作っても、思ったより検索に時間がかることがあります。そのような場合には、利用するメモリ量に合わせてチューニングする必要があります。デージーネットの改善支援コンサルティングサービスでは、こうしたチューニングの作業を行っています。

OpenSearch〜Elasticsearchをベースとした全文検索エンジン〜

oss情報(opensearch)

OpenSearchとは、Elasticsearchをベースに開発された全文検索エンジンです。このページでは、OpenSearchの開発経緯、OpenSearchの特徴、Elasticsearchとの互換性について紹介します。

デモのお申込み

もっと使い方が知りたい方へ
操作方法や操作性をデモにてご確認いただけます。使い方のイメージを把握したい、使えるか判断したい場合にご活用下さい。デモをご希望の方は、下記よりお申込みいただけます。

デモをご希望の方

デモの申し込みイメージ


全文検索エンジン「Elasticsearch」

Elasticsearch〜ビッグデータに対応した全文検索エンジン〜
Elasticsearchは、Apache Luceneをベースに開発された全文検索エンジンです。オランダのElastic社が開発を行っています。分散処理型の検索エンジンで、ビッグデータの解析などに使われています。
Elasticsearchのインストール
Elasticsearchは、Elastic社からパッケージなどで提供されています。そのため、簡単にインストールすることができます。また、docker HUBには、公式のdockerイメージも公開されています。ここでは、パッケージからのインストール方法を紹介します。

Elasticsearch〜ビッグデータに対応した全文検索エンジン〜の先頭へ