Elasticsearchで簡単な検索とscoreを調整する方法

Elasticsearch

まず、dockerでElasticsearchとKibanaの環境を構築します。
docker-composeで書くと以下のような設定になります。

起動したらElasticsearchにアクセスできることを確認。

マッピングの作成

マッピングはRDBでいうスキーマのようなものです。
ElasticsearchはJSONを投入すると自動でマッピングを作成してくれますが、
実際本番で使う場合はちゃんとマッピングを定義した方が良いそうなのでマッピングの作成から始めます。

インデックスに以下のような形のデータを登録したいとします。

その場合、マッピングは以下のように登録します。
用途に合わせて型やAnalyzerの設定を行う必要がありますがここでは省略します。

Elasticsearchではこちらに載っているデータ型が利用可能です。

クエリ検索とフィルター

_search に対して条件を投げることで検索できます。
shouldOR 条件、 mustAND 条件、 must_notNOT
filterWHERE みたいなものです。

結果

SQLで書くとこのような感じでしょうか。
mustfilter はどちらもAND条件なのですが filterscore に影響を与えない点が違うそうです。

検索結果の重み付け

Elasticsearchはデフォルトで score の高い順にソートされて返ってきます。
こちらをチューニングすることでよりニーズに合った検索結果を返すことができるようになります。

function_scorefield_value_factor を使用することでフィールドの値で重み付けを行うことができます。
functions 部分は score = favorites x 0.1 x 5 と同じような感じです。
boost は条件にマッチした場合にscoreを加算する機能で boost: 2 の場合はscoreが2倍になります。

結果

まとめ

簡単な検索と score を調整する方法を少し理解できました。
今のところ元のscoreの計算方法が謎ですが、
元scoreの調整、マッピングの最適化、ユーザーによって重み付けを変えるクエリの設計などにより
複雑な条件でもニーズにマッチした結果が素早く返せるようになるのかなと思いました。

参考リンク

Elasticsearch