[OpenSearch]MatchQueryでscore順に並ばない時

この記事は [株式会社サイバー・バズ Advent calendar 2021](https://qiita.com/advent-calendar/2021/cyberbuzz) 22日目の記事です。

# 概要
`OpenSearch`で全文検索をしている時に、想定通りに結果が返ってこないことがありました。

# 事象
`シャンプー`で全文検索したい！！

```
POST [index_name]/_search
{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "name": {
                            "analyzer": "my_analyzer",
                            "fuzziness": "AUTO",
                            "query": "シャンプー"
                        }
                    }
                },
                {
                    "match": {
                        "content": {
                            "analyzer": "my_analyzer",
                            "fuzziness": "AUTO",
                            "query": "シャンプー"
                        }
                    }
                }
            ]
        }
    },
    "sort": [
        {
            "publishFrom": {
                "mode": "max",
                "order": "desc",
                "nested_path": "nested_path_key"
            }
        }
    ]
}
```

すると返ってきた値は、

```
トリートメント
シャンプー
シャンプー(詰め替え)
・
・
・

```
でした。

うーん。シャンプーとかシャンプー(詰め替え)が先頭になってほしいな

あ！！分かった。重み付けをすれば良さそう！！

`OpenSearch`には`boost`というものがあるので、それによって検索に重み付けをすることができます。(documentはElasticSearch)

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-boost.html

今回は`name`が一番優先されるようにしたいので、以下のようにしました。

```
POST [index_name]/_search
{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "name": {
                            "analyzer": "my_analyzer",
                            "fuzziness": "AUTO",
                            "query": "シャンプー",
                            "boost": 2
                        }
                    }
                },
                {
                    "match": {
                        "content": {
                            "analyzer": "my_analyzer",
                            "fuzziness": "AUTO",
                            "query": "シャンプー"
                        }
                    }
                }
            ]
        }
    },
    "sort": [
        {
            "publishFrom": {
                "mode": "max",
                "order": "desc",
                "nested_path": "nested_path_key"
            }
        }
    ]
}
```

これで`name`が優先されるはず、、
検索！！

```
トリートメント
シャンプー
シャンプー(詰め替え)
・
・
・

```

変わらず。。

色々調べていると、ある事にふと気がつきました。

`response`で返ってきている、`max_score`が`null`です。

あれ、全文検索使っている時は`max_score`に数値が返ってくるはずでは？？

これでは、重み付けどうこうの話ではなさそうです。

結果的に以下のQueryで解決できました。

```
POST [index_name]/_search
{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "name": {
                            "analyzer": "my_analyzer",
                            "fuzziness": "AUTO",
                            "query": "シャンプー",
                            "boost": 2
                        }
                    }
                },
                {
                    "match": {
                        "content": {
                            "analyzer": "my_analyzer",
                            "fuzziness": "AUTO",
                            "query": "シャンプー"
                        }
                    }
                }
            ]
        }
    }
}
```

今までと何が異なるのかというと、`sort`を無くしました。

`sort`の並び替えが優先されるので、`score`で検索順位が変わるはずもありません。

フロントからの指定がない場合は、デフォルトで`publishFrom`の`sort`を入れていたので、全く気がつきませんでした。笑

同じことでハマる方はいなさそうですが、誰かの助けになれば幸いです。