雑文発散

«前の日記(2016-12-13) 最新 次の日記(2016-12-15)» 編集
過去の日記

2016-12-14 [長年日記]

[Crowi] Crowi を Elasticsearch 5.x で動かしたい

先日「Elasticsearch 5.x では Crowi の検索が動かないかも知れない」という日記を書いてから、もう少し調べていた。

下記の記事を参考にして、 mappings.json 内部の "type": "multi_field""type" : "string" に変えてやれば Elasticsearch 5.x でも検索インデックスの再構築が成功するようになる、、、のかと思いきや、うまくいかない。

何が悪いんだろう?と思いつつ、試しに Elasticsearch 用の Node.js 版クライアントである elasticsearch.js を v11 系から v12 系に上げてみたところ、検索インデックスの再構築に成功するようになった。

何が変わったんだろう?と思って、Changelog を見てみると、v12 からはデフォルトの ApiVersion が "5.0" になったようだ。バックエンドの Elasticsearch が 5.x なら ApiVersion も 5.0 じゃないとダメってことかな?

インデックスの再構築ができるようになって、検索を実行してみると、次はこんなエラーが出た。

{
  "error": {
    "root_cause": [
      {
        "type": "parsing_exception",
        "reason": "The field [fields] is no longer supported, please use [stored_fields] to retrieve stored fields or _source filtering if the field is not stored",
        "line": 1,
        "col": 11
      }
    ],
    "type": "parsing_exception",
    "reason": "The field [fields] is no longer supported, please use [stored_fields] to retrieve stored fields or _source filtering if the field is not stored",
    "line": 1,
    "col": 11
  },
  "status": 400
}

エラーメッセージに言われるがままに、Crowi 内部で生成しているクエリの fields の部分を stored_fields に変更してみると検索結果が返ってくるようになった。

var query = {
  index: this.index_name,
  type: 'pages',
  body: {
    //fields: fields,       // **OLD**
    stored_fields: fields,  // **NEW**
    sort: [ {_score: { order: 'desc'} }],
    query: {}, // query
  }
};

ここまでをまとめると、Crowi を Elasticsearch 5.x に対応させるには以下のことが必要そうだということまで分かった。

  • elasticsearch.js のアップデート
    • v11 から v12 へ
  • mappings.json の修正
    • "type": "multi_field" から "type" : "string" へ変更
  • 検索クエリの修正
    • fields から store_fields へ変更

これで Elasticseach 5.x を「新規に使う場合」は大丈夫そうかな。

ただ、この変更が「既に 2.x を利用している環境」に与える影響も確認しないと危なそう。場合によっては、Elasticseach のバージョンを確認した上で挙動の変更とかもありえるかも?

もうちょい確認を続けよう。