先日「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 に対応させるには以下のことが必要そうだということまで分かった。
"type": "multi_field"
から "type" : "string"
へ変更fields
から store_fields
へ変更これで Elasticseach 5.x を「新規に使う場合」は大丈夫そうかな。
ただ、この変更が「既に 2.x を利用している環境」に与える影響も確認しないと危なそう。場合によっては、Elasticseach のバージョンを確認した上で挙動の変更とかもありえるかも?
もうちょい確認を続けよう。