Query_stringのスコアの計算をコントロールしたい


#1

全文検索のために以下のようなquery_stringを使ったクエリがあるとします。
このとき、内部的には検索ワード「渋谷区」と指定したフィールドとの類似度から_scoreが計算されると思いますが、この_scoreの計算を無効にしたり、_scoreを0にしたりすることは可能でしょうか?

具体的にやりたいこととしては例えば、

  1. addressフィールドに検索ワード「渋谷区」が入っていたらスコアを1与える
  2. 得られた結果には_scoreが1と0の結果が入り混じっている
  3. _scoreの降順にソートすると、_scoreが1と0のグループに分かれる
  4. _scoreが1の中でupdated_atの降順にソート、0の中でupdated_atの降順にソートする
  5. それで得られた結果を最終結果とする

ということをやりたいです。

そのために、内部で計算される_scoreをコントロールする方法があれば知りたいです。
もしくは他の方法で実現できる(似たようなことができる)などあれば教えていただきたいです。

GET my_index/area/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "status": [
              1,
              2
            ]
          }
        },
        {
          "query_string": {
            "fields": [
              "name",
              "description",
              "address"
            ],
            "default_operator": "AND",
            "query": "渋谷区"
          }
        }
      ]
    }
  },
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    },
    {
      "updated_at": {
        "order": "desc"
      }
    }
  ]
}

elasticsearchのバージョンは5.6です。


(Jun Ohtani) #2

Function Score Queryというので、スコアを色々と操作することができます。まずは、こちらを試してみてはいかがでしょうか?


#3

ありがとうございます!

  • Function Score Queryでできました
  • また、mustを使うと内部でデフォルトのスコア計算が行われてしまうので、filterに変更してスコア計算を行わないようにすることで今回の課題は解決しました

(system) #4

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.