日本時間の2019年1月23日に、Googleは、日本でも「Google しごと検索」の提供を開始するとアナウンスしました。ごく簡単に説明してしまえば、Google の検索結果に、求人情報をわかりやすく表示し、ユーザーはその中から自分にマッチした求人情報を見つけることができるようになります。

つまり、様々な求人サイト、あるいは企業の求人ページに掲載されているような情報を、Google の検索画面上で横断検索することができるイメージですが、この検索結果に自社の求人情報を掲載したい場合は、該当する求人情報ページに対して、構造化データ(JSON-LD)の追加が必要になります。

逆に言えば構造化データを追加するだけで簡単に求人情報を Google 検索上に表示することが可能になるわけですが、この記事では、具体的な構造化データのマークアップサンプルを挙げて、Google しごと検索に必要な構造化データの記述方法を簡単に解説してみたいと思います。

前提となる求人情報の例

まず下記のような架空の求人情報を掲載下ページがあるとします。そして、この求人情報をどのように構造化データとしてマークアップすればよいかを続けて解説していきます。

会社名 サンプル株式会社
会社住所(勤務先) 〒150-0000
東京都渋谷区渋谷0-0-0 渋谷スカイビル56階
募集する役職名 ソフトウェアエンジニア
募集する役職の概要

サンプル株式会社が自社開発・販売する財務会計ソフトウェアの開発に従事して頂きます。

求められるスキル

  • 業務によるプログラム開発経験○年以上(開発言語問わず)
  • 猫好き
基本給 月額 360,000円

実際にはもっと細かい条件などが入ると思いますが、構造化データ上で必要なものとして、最低限の情報にしています。

構造化データのマークアップサンプル

続いて上記で挙げた求人情報を、Google しごと検索で利用可能な構造化データに反映してみましょう。すると下記のような内容になります。

  1. <script type="application/ld+json">
  2. {
  3. "@context" : "https://schema.org/",
  4. "@type" : "JobPosting",
  5. "title" : "ソフトウェアエンジニア",
  6. "description" : "<p>サンプル株式会社が自社開発・販売する財務会計ソフトウェアの開発に従事して頂きます。</p>
  7. <p>求められるスキル</p>
  8. <ul>
  9. <li>業務によるプログラム開発経験○年以上(開発言語問わず)</li>
  10. <li>猫好き</li>
  11. </ul>",
  12. "identifier": {
  13. "@type": "PropertyValue",
  14. "name": "サンプル株式会社",
  15. "value": "job-201901-001"
  16. },
  17. "datePosted" : "2019-02-01T09:21:34+09:00",
  18. "validThrough" : "2019-03-31T18:00:00+09:00",
  19. "employmentType" : "FULL_TIME",
  20. "hiringOrganization" : {
  21. "@type" : "Organization",
  22. "name" : "サンプル株式会社",
  23. "sameAs" : "https://www.example.co.jp",
  24. "logo" : "https://www.example.co.jp/images/logo.png"
  25. },
  26. "jobLocation": {
  27. "@type": "Place",
  28. "address": {
  29. "@type": "PostalAddress",
  30. "streetAddress": "渋谷0-0-0 渋谷スカイビル56階",
  31. "addressLocality": "渋谷区",
  32. "addressRegion": "東京都",
  33. "postalCode": "150-0000",
  34. "addressCountry": "JP"
  35. }
  36. },
  37. "baseSalary": {
  38. "@type": "MonetaryAmount",
  39. "currency": "JPY",
  40. "value": {
  41. "@type": "QuantitativeValue",
  42. "value": 360000,
  43. "unitText": "MONTH"
  44. }
  45. }
  46. }
  47. </script>
各部解説

それでは細かく構造化データの中身をみていきましょう。まず最初の部分。

  1. "@context" : "https://schema.org/",
  2. "@type" : "JobPosting",
  3. "title" : "ソフトウェアエンジニア",
  4. "description" : "<p>サンプル株式会社が自社開発・販売する財務会計ソフトウェアの開発に従事して頂きます。</p>
  5. <p>求められるスキル</p>
  6. <ul>
  7. <li>業務によるプログラム開発経験○年以上(開発言語問わず)</li>
  8. <li>猫好き</li>
  9. </ul>",
  10. "identifier": {
  11. "@type": "PropertyValue",
  12. "name": "サンプル株式会社",
  13. "value": "job-201901-001"
  14. },

ここまでで、求人情報内で募集している仕事(役職)についての情報を提供しています。

title には、職務の名称、つまり役職名が入ります。サンプルでは「ソフトウェアエンジニア」としていますが、他にも「プロジェクトマネージャー」ですとか、「営業」のような感じで役職を入れます。

注意が必要なのは、この値には「職務の名称のみ」を指定するということです。つまり下記のような例は推奨されません。

  1. <!--悪い例-->
  2. "title" : "ソフトウェアエンジニア - 未経験からスタートでも年収500万以上可能!!",

description には、その役職の概要を記述します。どういう仕事をしてもらうのか、必要なスキルなどは何か、といった情報を記述しましょう。値は HTML 形式で記述します。

次に、identifier で指定される各値についてですが、ここは「この求人情報に固有の識別情報」となりますので、下記の例だと『「サンプル株式会社」の管理番号「job-201901-001」(この値は自由に設定可能)という求人情報』という意味になっています。

求人情報がこの情報で一意に識別できればよいので、自社の求人情報なら「管理番号」に相当する部分だけ各求人情報で固有の値となるように付けておけば問題ありません。

  1. "identifier": {
  2. "@type": "PropertyValue",
  3. "name": "サンプル株式会社",
  4. "value": "job-201901-001"
  5. }

次のセクションに行きましょう。

datePosted は求人情報の公開日、validThrough は求人情報の有効期限を示します。

この値は ISO 8601 フォーマットに則った形で記述しますが、日本標準時をベースに記述するなら YYYY-MM-DDThh:mm:ss+09:00 という形式になりますので、例えば、「2019年1月31日 午後5時ちょうど」を示すなら 2019-01-31T17:00:00+09:00 と記述することになります。

  1. "datePosted" : "2019-02-01T09:21:34+09:00",
  2. "validThrough" : "2019-03-31T18:00:00+09:00",
  3. "employmentType" : "FULL_TIME",
  4. "hiringOrganization" : {
  5. "@type" : "Organization",
  6. "name" : "サンプル株式会社",
  7. "sameAs" : "https://www.example.co.jp",
  8. "logo" : "https://www.example.co.jp/images/logo.png"
  9. },

employmentType には雇用形態を示します。選択可能な値は下記の通り。この値は米国での雇用形態がベースになっているため、日本の雇用形態とは少しニュアンスが異なる値もあって難しいのですが、概ね下記のような意味合いになると思われます。

  • FULL_TIME → フルタイム(日本なら「正社員」という意味になるかと)
  • PART_TIME → パートタイム
  • CONTRACTOR → 外部委託(日本だと「契約社員」という意味合いで使われがち)
  • TEMPORARY → 臨時雇用
  • INTERN → インターンシップ
  • VOLUNTEER → ボランティア
  • PER_DIEM → 日払いの求人
  • OTHER → その他

複数の条件が当てはまる場合は、下記のように指定できます。

  1. "datePosted" : "2019-02-01T09:21:34+09:00",
  2. "validThrough" : "2019-03-31T18:00:00+09:00",
  3. "employmentType": ["FULL_TIME", "CONTRACTOR"],
  4. ・・・省略・・・

続く、hiringOrganization の部分は求人を出している会社の情報です。logo で会社のロゴを指定することもできます。

  1. "hiringOrganization" : {
  2. "@type" : "Organization",
  3. "name" : "サンプル株式会社",
  4. "sameAs" : "https://www.example.co.jp",
  5. "logo" : "https://www.example.co.jp/images/logo.png"
  6. },

次に jobLocation で、勤務地の情報を記述していきます。この求人情報で採用された人が、実際に働くことになる場所を記述してください。

  1. "jobLocation": {
  2. "@type": "Place",
  3. "address": {
  4. "@type": "PostalAddress",
  5. "streetAddress": "渋谷0-0-0 渋谷スカイビル56階",
  6. "addressLocality": "渋谷区",
  7. "addressRegion": "東京都",
  8. "postalCode": "150-0000",
  9. "addressCountry": "JP"
  10. }
  11. },

もしこの求人が特定の職場に通勤しなくても、日本国内ならどこからでもリモート勤務ができるという勤務条件であれば、下記のように jobLocation を記述せず、applicantLocationRequirements"jobLocationType": "TELECOMMUTE" を記述することで示すことができます。

  1. "applicantLocationRequirements": {
  2. "@type": "Country",
  3. "name": "日本"
  4. },
  5. "jobLocationType": "TELECOMMUTE"

もし、特定の職場に通勤する、もしくはリモートワークのどちらかを選択可能な求人の場合は下記のように jobLocation との併記も可能です。

  1. "jobLocation": {
  2. "@type": "Place",
  3. "address": {
  4. "@type": "PostalAddress",
  5. "streetAddress": "渋谷0-0-0 渋谷スカイビル56階",
  6. "addressLocality": "渋谷区",
  7. "addressRegion": "東京都",
  8. "postalCode": "150-0000",
  9. "addressCountry": "JP"
  10. }
  11. },
  12. "applicantLocationRequirements": {
  13. "@type": "Country",
  14. "name": "日本"
  15. },
  16. "jobLocationType": "TELECOMMUTE"

注意が必要なのは、Google のガイドライン上、「リモートワーク」というのは「完全なリモートワーク」であることです。例えば「基本的には通勤しなければならないが、状況によって一時的な在宅勤務が許される」ような求人は「完全なリモートワークが可能」とはみなされません。

最後に賃金(基本給)についての情報です。baseSalary として指定していきます。

  1. "baseSalary": {
  2. "@type": "MonetaryAmount",
  3. "currency": "JPY",
  4. "value": {
  5. "@type": "QuantitativeValue",
  6. "value": 360000,
  7. "unitText": "MONTH"
  8. }
  9. }

currency に支払い通貨を指定します。日本国内での求人であれば、通常、お給料は日本円で支払われると思いますので、JPY を指定。

次に value で実際の基本給を記述しますが、その下にある unitText との組み合わせで指定します。

unitText は、基本給の単位です。指定できる値は下記の通り。正社員であれば MONTH、もしくは YEAR での提示が多いと思われますし、アルバイトやインターンシップであれば、HOUR などが指定されるかと思います。つまり、今回のサンプルだと「月の基本給」が「36万円」ということになります。

  • HOUR → 時給
  • DAY → 日給
  • WEEK → 週給
  • MONTH → 月給
  • YEAR → 年俸

なお、minValue、および maxValue を指定することで、基本給の最少額と最大額、つまり基本給の範囲を示すことも可能です。

  1. "baseSalary": {
  2. "@type": "MonetaryAmount",
  3. "currency": "JPY",
  4. "value": {
  5. "@type": "QuantitativeValue",
  6. "value": 360000,
  7. "minValue": 360000,
  8. "maxValue": 560000,
  9. "unitText": "MONTH"
  10. }
  11. }

※ Google のドキュメント上では、minValue、および maxValue を指定した場合、value は不要と書かれているのですが、構造化データ テストツールで確認すると value は必須でエラーとなってしまうため、上記サンプルでは記述しています。

求人情報の削除

すでに応募を受け付けていない(validThrough で指定した日時を過ぎた)求人は、ページ自体を削除するか、ページから構造化データを削除する必要があります。

また、Indexing API を使用して求人情報の URL を Google の検索インデックスから削除するようリクエストすることも推奨されていますが、sitemap.xml を配信しているのであれば、終了した求人の URL を削除した上で Google に送信する方法でも問題ありません。重要なのは期限が切れて、応募があっても採用する気のない求人情報をいつまでも掲載したままにしないということです。

なお、Indexing API は新たに求人情報を掲載した際にも、素早く Googlebot に対して該当ページをクロールするよう指示を出せるため、しごと検索への情報提供を行うのであれば利用可能なように準備しておくとよいでしょう。


以上、Google が提供開始した「しごと検索」への情報提供に必要な構造化データについての簡単な解説でした。

大手の求人情報サイトに求人情報を掲載している場合はそれ程気にする必要はないかと思いますが、自社で採用サイトをお持ちで、そこからの求人応募をしっかり取っていきたいというような企業の場合は取り組んでみてもよいのではないでしょうか。

参考情報