@johtaniの日記 2nd

@johtani ‘s blog 2nd edition

Elasticsearch 1.5.0リリース(日本語訳)

※この記事は次のブログを翻訳したものになります。

原文:Elasticsearch 1.5.0 Released

本日(3/23)、Lucene 4.10.4ベースのElasticsearch 1.5.0 をリリースしました。 このリリースはElasticsearchの最新の安定バージョンとなります。 多くのresiliency(復元性、弾力性) enhancementとバグフィックスを含んでおり、 すべてのユーザにアップグレードを推奨しています。

すべての変更についてはdownload Elasticsearch 1.5.0 hereをごらんください。

460PRという大量の変更を含む本リリースは、Elasticsearchをよりresilient(弾力のあるもの)にするために 費やされています。

Inner hits

本リリースで追加された、Elasticsearchに最もリクエストされたものの一つがinner hitsです。 これは、has_childもしくはnestedクエリにマッチした子のドキュメントを、各親ドキュメントと一緒に返すことができます。

例えば、blogという親ドキュメントとcommentという子ドキュメントを持っているとします。 この時、”full text search”というコメントを持ったブログ記事を検索したいとします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
GET /my_index/blog/_search
{
  "query": {
    "has_child": {
      "type":       "comment",
      "score_mode": "sum",
      "query": {
        "match": {
          "body":   "full text search"
        }
      }
    }
  }
}

上記のリクエストは、親のblogドキュメントを返します。 しかし、どのコメントが関係しているのかはわかりません。 関連しているコメントを検索して親ごとにグルーピングするために、 少し手間のかかる2回目のクエリを実行する必要があります。

Inner hitsがこれを変えてくれます。 inner_hitsパラメータを次のように、上記のクエリに追加するだけです!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET /my_index/blog/_search
{
  "query": {
    "has_child": {
      "type":       "comment",
      "score_mode": "sum",
      "query": {
        "match": {
          "body":   "full text search"
        }
      },
      "inner_hits": {}
    }
  }
}

検索結果の各blog記事に、inner_hitsという項目があり、そこに検索にヒットしたコメントの 上位3件(デフォルト値)が返ってきます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
...
"hits": [
  {
    "_index":   "my_index",
    "_type":    "blog",
    "_id":      1,
    "_score":   3.68,
    "_source":  { ... },
    "inner_hits": {
      "comment": {
        "total": 16,
        "hits": [
          {
            "_type":    "comment",
            "_id":      5,
            "_score":   2.79,
            "_source": {
              "body":   "Full text search is the bomb"
            }
          },
          { ... },
          { ... }
        ]
      }
    }
  }
]
...

inner_hits部分は、第2の検索リクエストに似ています。 sizefromパラメータを含めるくことで、挙動をカスタマイズできます。 また、検索から想像するであろう、ページネーション、ソート、ハイライト、_sourceフィルタリングなどといった機能もサポートします。

Inner hitsはparent-childおよび、nestedドキュメントをサポートします。 この機能は、現時点ではexperimentalラベルが付与されています。 このラベルは、この機能が将来変更されたり、削除されたりする可能性があるかもしれないことを意味します。 詳細については、Inner Hits documentationをごらんください。

Shadow replicas

Elasticsearchはそれ自身の冗長性に常に気をつけています。 それは、レプリカシャード(各プライマリシャードの冗長なコピー)を持っています。 これは、プライマリシャードを失った時に、データをロスしないようにするためのものです。 レプリカシャードはまた、検索のスループットをスケールアウトするためにも利用できます。 多くのレプリカ(ノードを伴うことで。)はスループットを増加させます。

しかし、ユーザによってはElsticsearchを分散ファイルシステム上でホスティングしており、すでに、 ファイルシステムがレプリケーションと冗長性を担当しています。 ファイルシステムが同じことしているので、各シャードのコピーを複数持つことはあまり意味がありません。

Shadowレプリカはノードを追加することによる検索スループットをスケールアウトすることが、 余分なストレージやインデキシングのコストを払うことなく、可能になります。 代わりに、各シャドーレプリカはプライマリシャードを持っている共有ファイルシステムにread-onlyでアクセスします。 Shadowレプリカは定期的にファイルシステムのビューをリフレッシュし、プライマリシャードのどんな変更も検知するでしょう。

プライマリシャードが失敗したら、Shadowレプリカがプライマリに昇格し、 失敗したプライマリによって書き込まれたトランザクションログを読み込みリプレイできます。

この機能はexperimentalマークが付いています。詳細についてはShadow Replicas documentationをごらんください。

Resiliency improvements

Elasticsearch 1.1 から 1.3では、インデックスのすべてのファイルのチェックサムを追加し、 それらのファイルが壊れているかどうかをチェックするために利用することにフォーカスしました。 1.4では、Zen discoveryと分散モデルについて大きな改良を加えました。

これらの変更にともなう、より詳細な統計情報やより詳細なロギングがElasticsearchやLuceneの以前のバージョンに存在した 未知の問題を明るみに出しました。 Elasticsearch 1.5.0では、これらの問題の多くに対処しています。

  • ElasticsearchとLuceneの以前のバージョンにあるバグがインデックスの故障を引き起こしていました。
    チェックサムコードのおかげで、これらを発見できました。現在は、Elasticsearchの起動時に自動的にLucene3.x
    (Elasticsearch 0.20.x以前)が作成したセグメントを検知して、シャードをオープンする前に、新しいフォーマットを使って、 新しいコミットポイントを書き出します。(#9899)

  • 1.3.xもしくは以前のバージョンからローリングアップグレードは、ローカルのシャードデータを再利用しようとせずに、
    シャード全体をコピーしようとします。1.3.2と以前のバージョンが実行されているノードからローリングアップグレードすることは 圧縮をオフにしない限りできなくなりました。(#9925)
    1.3.xやそれ以前のバージョンからアップグレードする場合、ローリングアップデートする代わりにクラスタの再起動を考えたほうがいいかもしれません。

  • 非同期環境は予測することが難しいです。時に、最も予測していないことが起きるからです。
    シャード配置、リカバリ、削除のコードの多くが単純化され、状態変更をよりアトミックで決定的にするための変更によりリファクタリングされました。
    (#8720, #9799, #9784, #9801, #9083, #8579, #8436, #8092, #9902, #6644, #8350, #9770, #9616, #9439, #8350, #8494)

  • 同様に、変更はクラスタ状態の更新が常に前進するということを確実にしました。更新の受け取り順序が順不同であったり、
    マスターだったノードからの更新を受け取った場合に混乱させていました。 (#9632, #9541, #9503)

  • チェックサムとチェックサムのバリデーションの強化(#8723,
    #8599, #8587, #8407, #8010, #8018)

  • disk threshold allocation deciderを速く(#8803)、賢く(#7785)、自動化(#8270)

  • auto-generated IDの利用時のインデキシングのスピードアップのためのに追加された最適化を除去。
    たまにドキュメントを重複して登録するため(#7729)

Download now

ぜひ、Elasticsearch 1.5.0をダウンロードして、試してみてください。 そして、感想をTwitter(@elastic)などで教えて下さい。 また、問題がありましたら、GitHub issues pageで報告をお願いします。

Comments