見出し画像

求人検索APIで給与順の実装を行った話

はじめに

こんにちは、株式会社Caratでバックエンドエンジニアをしているトラツグミです。
今回は弊社プロダクトである求人Hubで使用している検索APIについて説明させていただきます。
求人Hubでは求人のデリバリーのために、検索を用いたAPI連携も行っており、検索エンジンではOpenSearchを用いています。
このOpenSearchなどの検索エンジンで検索システムを構築する際には、クエリやマッピングの設計はかなり重要だと思います。
私自身もこの点に関する悩みは尽きず、試行錯誤を行っています。
今回はその試行錯誤のうちの1つを簡単に紹介させていただきます。

求人検索のAPIに給与ソートを追加する

求人Hubの検索APIについて

求人Hubでの検索APIでは文字通り、求人の検索を行っています。
求人検索では単にキーワードマッチングだけが求められるのではなく、給与での降順ソートや正社員採用などの条件でのフィルターも必要です。
検索条件を満たしながら、キーワードとのマッチ度が高い求人を提示する。
それが検索APIの理想です。

給与ソートとは

給与ソートとは、求人に記載されている給与額でのソートのことです。
具体的な数値を例に挙げて説明すれば、時給1000円と時給1500円の似た内容の求人があれば、当然ユーザーは時給1500円の方が上位に来るようにするソートのことです。
この給与額の降順に並べ替えてあげるのが、今回の給与ソートです。
数値順にするのであれば簡単に思われますが、今回は2点課題がありました。

求人によって違う給与表記が違うので全ての基準を月収に

弊社で取り扱う求人ではアルバイトや正社員など様々な契約形態が入り混じっています。
同じような内容の求人でも、提示給与の形式が月収や時給になっている求人が混在しています。
そのため、時給2000円と月収20万円などがあり、単純に数値比較ができない状態です。
そこで今回行ったのが、給与の正規化です。
給与基準を月収に揃える事で、単純な数値比較ができるようにしました。
日本の法定労働時間は1週40時間と決められています。
また1月はおおよそ4週間なので時給であれは 時給額 × 40h ×4 でおおよその月収になります。
年俸表示であれば12分割、日当であれば 5 × 4 を乗算するなどで計算し保持します。

$$
\begin{array}{|c|c|c|} \hline
\text{給与額} & \text{給与区分} & \text{正規化後(月収)} \\
\hline\hline
1,500\text{円} & \text{時給} & 240,000\text{円} \\
\hline
13,000\text{円} & \text{日当} & 260,000\text{円} \\
\hline
200,000\text{円} & \text{月収} & 200,000\text{円} \\
\hline
\end{array}
$$

検索ワードとのマッチ率も考慮に

給与額を月収へ揃えることで、数値比較を行えるようにしました。
その後、検索ワードの一致率も維持するためにキーワードマッチ率 × 給与額でスコア計算を行いました。
給与が高くても、検索ワードと関係ないものは順位が下がるようにしてあります。
例としては以下の図のような順です。
今回はエンジニアで検索した場合を想定しています。

$$
\begin{array}{|c|c|c|} \hline
\text{求人タイトル} & \text{給与額} & \text{順位} \\
\hline\hline
\text{エンジニア} &40 \text{万円} & 1\text{位} \\
\hline
\text{エンジニア} &30 \text{万円} & 2\text{位} \\
\hline
\text{技術営業} &50 \text{万円} & 3\text{位} \\
\hline
\end{array}
$$

おわりに

検索APIに追加実装した、給与ソートのお話でした。
求人Hubでは今回の検索APIの他にも求人のデリバリーのために色々な機能開発を行っています。
もし今回の記事で興味を持った方がいらっしゃいましたら、ぜひCaratのHPを見てみてください。


この記事が気に入ったらサポートをしてみませんか?