Meilisearchを使っていて、結果を新着順に並べたいケースがあったのですが、割と調べることになったのでメモを残します。
Meilisearchの概要は省略します。
ドキュメントを参考にしてください。
Meilisearchでのランキングルール
Meilisearchでは、検索クエリを用いてインデックス内のデータを絞った後にランキングルールを用いて並び替えを行います。
- Words(検索クエリとマッチしている方が良い)
- Typo(タイポが少ないほどよい)
- Proximity(検索対象の文章中でマッチした語間の距離が近いほどよい)
- Attribute(その他の属性でソートする)
- Sort(指定したソートを実行)
- Exactness(検索クエリと一致してる方が良い)
meilisearchではバケツソート的な考え方を採用してるので、1の条件でソートを行い、1が同列であれば2でソート, ...といった具合に上位に設定されているルールの影響が強く結果に反映されます。
本題:新着順ソート
前節の理由から、timestamp
のようなAttributeを追加して、結果が新着順になるように以下のように検索クエリを投げたとしても、Word等の結果が優先されるため思った通りの結果が得られないことがあります。
client.index('books').search('science fiction', {
sort: ['timestamp:desc'],
})
では、どうするかというと、ランキングルールを書き換えるのが良いです。
client.index('movies').updateRankingRules([
'sort',
'words',
'typo',
'proximity',
'attribute',
'exactness',
])
これでソートを効かせたい時だけ、ソートを有効に出来ます。
参考
https://www.meilisearch.com/docs/learn/relevancy/ranking_rules
https://www.meilisearch.com/docs/learn/filtering_and_sorting/sort_search_results
https://www.meilisearch.com/docs/reference/api/settings#ranking-rules
現在、仲間を募集中!
株式会社ホープでは、福岡で働くエンジニアを募集中です。
ぜひ、求人を見てみてください!
▼ Wantedly求人
https://www.wantedly.com/projects/1684027
▼ コーポレートサイト
https://www.zaigenkakuho.com/recruit/
「自治体を通じて人々に新たな価値を提供し、会社及び従業員の成長を追求する」
この理念の実現に向けて、今後も自治体の課題解決に取り組んでいきます。
ご応募お待ちしております!