UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Elasticsearch】価格の近い順にソートする

Elasticsearchでドキュメントを指定した価格に近い順にソートしたい

昇順でも降順でもないので、これは_scriptセクションを使用してカスタムソートを定義するしかなさそう

ロジックは各ドキュメントの価格と目標価格(params.target_price)との絶対値差を計算し、その差が小さい順("order": "asc")にドキュメントをソートすることを考えた

できたクエリが以下

{
  "query": {
    "match_all": {}
  },
  "sort": {
    "_script": {
      "type": "number",
      "script": {
        "lang": "painless",
        "source": "Math.abs(doc['price'].value - params.target_price)",
        "params": {
          "target_price": 30 // 指定した価格
        }
      },
      "order": "asc" // 昇順で近い価格の商品からソート
    }
  }
}

これで価格の近い順にソートすることができた

ただ注意点として、スクリプトベースのソートは計算コストが高くなりがちなので、大規模なインデックスで使用する場合はパフォーマンスに影響を与える可能性がある

今回はレスポンスが遅くても問題ない箇所だったのでこのまま使用する