野次馬エンジニア道

野次馬な気持ちでプログラミングをあれこれと綴ります

ElasticSearch入門 (1) 基本概念・インデックス作成・アナライザ

近所の本屋で売っていたので興味を持って購入。現在のElasticSearchのバージョンは2.1。書籍は0.90.11とかなり古い。色々変わっていたのでメモ。

高速スケーラブル検索エンジン ElasticSearch Server

高速スケーラブル検索エンジン ElasticSearch Server

本書はcURLを使って読み進める前提だが、リクエストとDSLを手で書くのは骨が折れる。 今ならSenseという専用のエディターが使える*1。 補完も聞きJSONのバリデートもしてくれるのでそちらで絶対に試すべき。

デーモンでの起動・停止

書籍では-fとなっていた。

./bin/elasticsearch -d

で、ついでに停止のAPIは無くなった*2

スクリプトによるドキュメントの更新

curl -XPOST http://localhost:9200/blog/article/1/_update?pretty -d '{"script": "ctx._source.content=\"new content\""}'

な感じで更新する例がでているが、登録したドキュメントの更新にはconfigの変更が必要*3

script.inline: on
script.indexed: on

基本概念

インデックス(Index)

データを保存する場所。RDBでいうところのテーブルに該当する。ElasticSearchは検索を目的としているので元の文書の格納は必ずしも必要ない。 実体は転置インデックスであることをイメージすると理解が進む。

ドキュメントタイプ(Document type)

一つのインデックス内に複数の用途に応じたオブジェクトを格納する場合。インデックスを分けるかタイプを分けるか? 下記の記事が参考になる。

ノード(Node)とクラスタ(Cluster)

ElasticSearchは可用性と耐障害性を実現するために複数のサーバ上で実行される。このサーバ群をクラスタ、個々のサーバをノードと呼ぶ。

シャード(Shard)

大量のデータを扱うときはそれぞれのノードでデータを分割して保持する。その際にシャードと呼ばれる部分インデックスで分割する(シャードのそれぞれの実体はApache Luceneのインデックス)。アプリケーションはクラスタに対してRESTのAPIで検索をかけるが、その際それぞれのシャードの配置や構成に関しては意識する必要がない。

レプリカ(Replica)

それぞれのノードにはシャードのレプリカが存在する。更新は勿論プライマリのシャードに対して行われるが、万が一プライマリのシャードが失われると新しく、レプリカのシャードがプライマリになる。

インデックス作成

スキーママッピング(Schema mapping)

ElasticSearchはスキーマレスで動的にデータを解釈することもできる。が、多くの場合あらかじめ構造を定義して用いる。

{
  "mappings": {
    "post" : {
      "properties": {
        "content" : {
          "type": "string",
          "index": "analyzed"
        }
      }
    }
  }
}

タイプ(Document Type)とフィールド

上の例では一つのタイプとしてpostが含まれている。フィールドの定義でのポイントは"analyzed"。これはElasticSearchがアナライザをかけて転置インデックスに格納するかどうかの設定。"not_analyzed"を指定した場合はそのままインデックスに入る。つまり完全一致のみとなる。さらに "not_analyzed"の場合はDoc Values*4というファイルを使ったキャッシュに入る。

マルチフィールド(Multi fields)

場合によっては2つのフィールドに同じフィールドの値を持ちたいユースケースもある。検索用とブラウズ用のような。そのためのデータの持ち方*5

{
  "mappings": {
    "post": {
      "properties": {
        "name": {
          "type": "string",
          "fields": {
            "raw": { 
              "type":  "string",
              "index": "not_analyzed"
            }
          }
        }
      }
    }
  }
}

アナライザ

ElasticSearchのアナライザとは、インデックスを作成したりクエリを解析するときにデータをどのように処理するかを指定する機能のこと。 インデックスの時であれば、どのように転置インデックスを作成するか。検索のときであればどのようにクエリを分解してインデックスにマッチさせるか。

アナライザはトークナイザと複数のフィルタから構成される。インデックス時と検索時で別々のアナライザを指定可能。 図で表すと下記の感じ。

f:id:notta55:20151221000950p:plain

独自のアナライザを定義すると下記のような記述となる。フィルタは順番が重要なことに注意。

{
 "settings": {
   "analysis": {
     "analyzer": {
       "ourAnalyzer" : {
         "tokenizer" : "standard",
         "filter" : [
           "asciifolding",
           "lowercase",
           "ourEnglishFilter"
          ],
         "char_filter" : ["html_strip"]
       },
       "filter" : {
         "ourEnglishFilter" : {
           "type" : "kstem"
         }
       }
     }
   }
 }
}