この記事は 株式会社サイバー・バズ Advent calendar 2021 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)
今回は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
を入れていたので、全く気がつきませんでした。笑
同じことでハマる方はいなさそうですが、誰かの助けになれば幸いです。