Elasticsearch入門!概要とはじめての検索

81ksW936MTL

この本を読みました!

Elasticsearch実践ガイド

Elasticsearchとは?

image_2019_6_28

Elasticsearchは、「検索サーバ」です。
内部には、Apache Luceneという、検索ライブラリを採用しています。Elasticsearchを全文検索エンジンと呼ぶことが多いですが、全文検索の本体はApache Luceneです。
ちなみに、同じように内部にApache Luceneを採用している検索サーバとして、Apache Solrというものもあります。
Elasticsearchは後発ですが、DB-Engines Rankingによると、2016年ごろにApache Solrを上回っていて、人気が高まっています。

Elasticsearchの特徴は?

Elasticsearchでは、検索自体はApache Luceneに任せていて、Elasticsearch自体は、Luceneを活用するためのサーバとしての役割を担っています。

  • 分散配置できる (=高性能・高可用性)
  • JSONフォーマットのドキュメント指向DB
  • REST APIで操作できる

データが大規模になっても高いパフォーマンスで検索できるように、分散配置ができるようになっていて、JSONフォーマットやREST APIで使いやすく設計されている、というのが特徴です。

Elasticsearchを起動してみる

Elasticsearchを起動して、ドキュメントの追加と検索を試してみます。ドキュメントというのは、Elasticsearchのデータのことで、RDBMSでいうとレコードに相当します。
Dockerイメージがあるので、これを使って、立ち上げてみます。

docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.8.1

起動したら、ステータスを確認してみます。

$ curl -X GET 'http://localhost:9200/_cat/health'
1561879921 07:32:01 docker-cluster green 1 1 0 0 0 0 0 0 - 100.0%

クラスタが「green」となってることが確認できました。
ElasticsearchはREST APIで操作できるので、クライアントツールなどをインストールしなくても操作することができます。

ドキュメントの登録

さっそくデータを投入してみます。
ドキュメントには、「/{インデックス名}/{タイプ名}/{ドキュメントID}」というパスが割り当てられています。インデックスとタイプは、RDBMSでいう、データベースとテーブルに該当します。
そこにJSON形式のドキュメントをリクエストボディとして、PUTリクエストを送信します。

$ curl -X PUT 'http://localhost:9200/my_index/my_type/1?pretty' -H 'Content-Type: application/json' -d '{"title":"hello world"}'
{
  "_index" : "my_index",
  "_type" : "my_type",
  "_id" : "1",
  "_version" : 4,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 3,
  "_primary_term" : 1
}

無事に登録ができました!
検索を試すために、他にも2件データを入れておきます。

curl -X PUT 'http://localhost:9200/my_index/my_type/2?pretty' -H 'Content-Type: application/json' -d '{"title":"Elasticsearch is the most popular search engine in the world."}'
curl -X PUT 'http://localhost:9200/my_index/my_type/3?pretty' -H 'Content-Type: application/json' -d '{"title":"Hello! My name is katty0324."}'

ちなみに、ドキュメントIDを指定せずに、POSTリクエストをすれば、自動的にIDを割り当てて登録してくれます。

検索してみる!

これで3件のドキュメントが追加された状態になります。

IDtitle
1hello world
2Elasticsearch is the most popular search engine in the world.
3Hello! My name is katty0324.

ここで、titleにhelloを含むドキュメントを検索してみます。

$ curl -X GET 'http://localhost:9200/my_index/my_type/_search?pretty' -H 'Content-Type: application/json' -d '{"query":{"match":{"title":"hello"}}}'
{
  "took" : 9,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "my_type",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "title" : "hello world"
        }
      },
      {
        "_index" : "my_index",
        "_type" : "my_type",
        "_id" : "3",
        "_score" : 0.2876821,
        "_source" : {
          "title" : "Hello! My name is katty0324."
        }
      }
    ]
  }
}

「hello」を含むドキュメントだけが取り出せました!

Elasticsearch面白い!

以上、めちゃくちゃ簡単な例でした。
Elasticsearchはドキュメント指向DBの側面もあるので、構造をもったデータを管理して、検索することができます。クエリは、JSON形式で複雑な条件を表現することができます。
RDBMSで検索機能を組み立てようと思うと、パフォーマンスの課題が出てくることが多いと思います。Elasticsearchでは、転置インデックスによる検索に最適化されたデータ構造に加えて、シャーディングによる性能向上ができるので、パフォーマンス要件を満たすのも比較的簡単なのではと思います。
使いみちが色々思いつくので、さらに理解を深めていこうと思います!

タイトルとURLをコピーしました