UGA Boxxx

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

【Elasticsearch】重みをつけて検索

Elasticsearchにあるデータで、あるフィールドに重みをつけて検索したい

そして、単に重み付けだけでなく条件式を書いて条件にマッチしたフィールドだけに重み付けしたい

まずは重み付け検索について www.elastic.co

script_scoreを利用する

GET /_search
{
  "query": {
    "script_score": {
      "query": {
        "match": { "message": "elasticsearch" }
      },
      "script": {
        "source": "doc['my-int'].value / 10 "
      }
    }
  }
}

このとき、scriptのsourceでreturnされるものがスコアになるので、このsourceの中でフィールドの値に重み付けしてあげればよい

次に条件式だが、これもsourceの中に書くことができる

sourceはElasticsearch独自のPainless言語が記述できる

文法のドキュメントが見当たらないが、記述方法の例が下のドキュメントにあった(v6.8だが雰囲気はわかった)
Painless Examples | Painless Scripting Language [6.8] | Elastic

これを参考にsourceには次のような書き方で判別して重みづけすることができるようになった

     "source": "if(doc['condition'].value == 'Hoge'){ doc['my-int'].value / 10 } else {doc['my-int'].value}",