fields
を何に使っているのかと思って、関連していそうなファイルを調べていたけど、どうもこれは使ってないのでは?と思いながら、もう一度 lib/utils/search.js
を眺めていたらコメントが見つかった。
// getting path by default is almost for debug
なるほどデバッグ用途。でも、さらに良くみると、検索用クエリを作成する関数の引数には取得するフィールド名を指定できるような書き方になっている。ということは、コードの意図は「外部から指定したフィールド情報を得られるようにしたい」というものなのかも。
もしそうなら、クエリから fields
の指定を取っ払ってしまうのは、ちょっとスジが悪いかも知れない。
ということで、Elasticsearch のバージョンにより、fields
か sotored_fields
かを使い分けるようなコードを書いてみている。今回以外でも、そのうちどこかでバージョンごとの差異を吸収するコードも必要になるだろうし。
elasticsearch.js には、info というメソッドがある。こいつがバージョン情報を含んだ JSON を返してくれる。
例えば Elasticsearch v2.4.2 だとこんな感じで返ってきた。
{
"name": "Nimrod",
"cluster_name": "elasticsearch",
"cluster_uuid": "7RkgJy0wR-m8zp4y8eLeeg",
"version": {
"number": "2.4.2",
"build_hash": "161c65a337d4b422ac0c805f284565cf2014bb84",
"build_timestamp": "2016-11-17T11:51:03Z",
"build_snapshot": false,
"lucene_version": "5.5.2"
},
"tagline": "You Know, for Search"
}
この version.number
をパースしてバージョン比較をやればいいかな。