google 検索　求人情報に対応する

2019年、googleの求人検索がリリースされました。

googleのプレスリリース
https://japan.googleblog.com/2019/01/shigoto-search.html

google検索で「求人情報」と入力して検索するとこのような窓が現れます。
![求人.png](https://developers.google.com/search/docs/data-types/images/jobs-search-ui.png?hl=ja)

googleが独自に対象を検索した結果が表示されます。
検索履歴や位置情報がgoogleに反映されていれば、検索者のニーズに近いものが表示されているかもしれません。

indeedや他の転職サイトとはまた違った使い方ができそうです。

googleのしごと検索では、サイトを跨って検索ができます。
すでに求人サイトがしごと検索に対応しているので、
求人サイトに登録することで検索結果に表示させることはできますが、
自社のサイトに直接誘導できれば、コストを減らすことができるかもしれません。

ではどのようにすればgoogleの検索にかかるようになるのでしょうか。

#構造化マークアップする
##webページの構造化とは、

構造化とは端的に言うと機械にもわかりやすく記述することです。

ですので、webページの構造化というと、
機械＝クローラーにもわかりやすいページにすることになります。

クローラーが理解しやすいページはSEOに強いページにもなりえます。

どういった情報なのか、以下のようなメタデータを付与することで、
クローラーが効率よくデータを集められるようにします。

- Microformats
- Microdata
- RDFa/RDFa Lite
- JSON-LD

googleではJSON-LDという書き方を使うことを推奨しています。

google検索　ガイド　構造化データの仕組みについて
https://developers.google.com/search/docs/guides/intro-structured-data

webページの内容をjavascriptベースのJSON-LD形式で構造化してスクリプトにセットするので、
冗長的にはなりますが、明確なデータ伝達が行えます。
意図的に全く違う内容をセットすることもできてしまいますが、
実際のページと大きな相違がないかはチェックはしているようです。

##jsonとは？

jsonとはJavaScript Object Notationの略で、
端的に言うとJavaScriptをベースに記述された構造体です。
キーと値をセットしていくだけの簡単な構造なので多言語間でも交換が可能です。
xmlよりも軽く扱えます。

たとえば、

```javascript:
{
  "name": "山田　花子"
, "birthDate" : "1980/08/06"
}
```

のように、「:」（コロン）の左側にキーを、右側に値を定義します。
値が連続する場合は、「[]」で囲みます

```javascript:
{
  "name": "山田　花子"
, "birthDate" : "1980/08/06"
, "children" : ["太郎","次郎"]
}
```

値に構造体をあてることもできるので、深い階層でのデータ定義が可能です。

```
{
  "name": "山田　花子"
, "birthDate" : "1980/08/06"
, "children" : [{"name":"太郎","birthDate":"2011/01/12"}
,{"name":"次郎","birthDate":"2015/10/10"}]
}
```
nameやageは意味のあるkeyです。
言語を理解する人間にはこれがどのような意味があるのかわかりますが、
値を逆にしてもエラーとはなりません。

これに属性を追加したのがJSON-LDです。

##json-LDとは？

JSON-LDはjsonの構造体を用いてデータを直列化するための構文です。
https://json-ld.org/

ldはlinked dataです。
入れ物としてのjsonに属性を定義することで、
データをひとつの塊にしていきます。

keyとvalueをセットとし、
"@type":"値"
"@key":"値"
"@id":"値"
といった書き方をします。

求人情報ではJSON-LDとschema.orgのjobposting定義を用います。
https://schema.org/JobPosting

schema.orgではデータの意味を定義するためのルールが定義されています。
この定義にはこういったプロパティを設定しましょう。といった感じのものです。
JSON-LD以外にMicrodata,RDFaでも表現できます。
※schema.orgはYahoo!、Microsoft、Googleら検索プラットフォーマーが共同で設立した団体。

前述のjsonで記述したものをschema.orgの定義に従って書き直すと、

```
<script type="application/ld+json">

{
    "@context": "http://schema.org/",
    "@type": "blog",
    "author": {
      "@type": "Person",
      "name": "山田　花子",
      "birthDate" : "1980/08/06",
      "children" : [{"@type" : "Person"
                     ,"name" : "太郎"
                     ,"birthDate" : "2011/01/12"}
                   ,{"@type" : "Person"
                    ,"name" : "次郎"
                    ,"birthDate" : "2015/10/10"}]
    }
}

</script>
```

このような構造体をscriptとして組み込むことで、

この**ブログ(blog)**の**筆者(author)**は「山田　花子」という**人物(person)**で**生年月日(birthday)**は「1980/08/06」で、
**子供(children)**に太郎（2011/01/12生まれ）と次郎(2015/10/10生まれ)という人物がいます。

といった情報をウェブサイトに付与することができます。

#求人情報を表示させるには？

webページの内容をgoogleの求人情報にのせるには、
jobpostingのjson-ld構造体を組み込みます。

google検索　ガイド　求人情報
https://developers.google.com/search/docs/data-types/job-posting?hl=ja

たとえばレシピやニュースを構造化データで表現すると、
リッチスペニクトといわれる表示に反映させることができます。

求人情報も同様に、構造化データを用いることになります。

##どのようにサイトを構成するか

実際にサイトに組み込む前にwebサイトの構成自体を考え直してみましょう。

上記のガイドには以下のようなことが書かれています。

- リストページには設定してはいけない
- ひとつのジョブに対して設定する
- 同時に複数個所で同じような募集の場合は別々のページが必要
- 同じ内容の求人はまとめられる（しごと検索ページで「○○で応募」ボタンが増える）
- ページ上に、ユーザーが求人に応募する方法を用意する 

サイトを作成する側は、求人情報を載せたページに構造体を配置します。
ガイドにあるように、リストには構造体を配置できません。
1求人に対して1ページを作成し、1つの構造体を配置する必要があります。

検索結果などリストページ
![listtodetail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172603/fe3b0ae4-46d8-bd04-dfdd-f0029293144c.png)




　　　　　＞＞　各求人ページ（こちらにjobpostingの構造体を1つ配置）

応募方法を記載していれば、
応募画面は別ページでも可能です。
構造体には応募方法の記述箇所はありません。

##構造体の内容を作成する

googleがしごと検索で使用するのはschema.orgに定義されているjobposting項目の一部の情報です。
レファレンスで必須となっている部分には必ず内容を設定しましょう。
レファレンスに掲載されている以外の項目を細かく設定してもいまのところは意味はありません。
が、
役に立つと判断されれば、将来の検索機能にこれらの要素が使用されるかもしれません。
https://developers.google.com/search/docs/guides/intro-structured-data

とあるので、
そのうち変更があるかもしれません。


項目別に説明していきます。

###title
タイトル　必須項目
企業ロゴが設置されていない場合、タイトルの最初の文字がロゴの代わりになるります。

##hiringOrganization
職位を提供している組織　必須項目
schema.org定義の"@type": "Organization"を記述する。
大きな会社であれば本社の情報を記入
ここでlogoを指定しておけばアイコンにlogoを表示できます。
が、
サードパーティーの設置の場合、社名の最初の文字の「株」がタイトルになっている場合も多々・・・
うまくいけばナレッジグラフ カードの情報とリンクできます。

###jobLocation
就業した場合の実際の職場　必須項目
現在地とのルートを計算した結果が○分という形で上部にアイコンで設置される
"@type": "Place","address": {"@type": "PostalAddress"
で住所などを指定する。
下部にgoogle mapで表示される。

###dateposted
投稿日　必須項目
○日前　といった形で上部にアイコンで設置される

###description
詳細　必須
HTML文で記述します。
タグは表示用コードで記述したほうが無難でしょう。
（DB登録したデータだと、escape処理されてしまうとかあるので）

###baseSalary
給与　推奨項目
上部にアイコンで設置される

"unitText"には以下のいずれかを入力するように書かれています。

- "HOUR"
- "DAY"
- "WEEK"
- "MONTH"
- "YEAR"

日本語化せずに上記のkeyを記述してください。
YEARとMONTHの双方を記述しても、どちらかしか表示されません。
Valueが記載されていればValueの値を
月　○万
といった形で表示します。
minValueとmaxValueの場合は月　○万～○万となります。

value
か、minValue　＆　maxValue　のいずれかを記入とあります。

###employment
雇用形態　推奨項目
上部にアイコンで設置される

##作成したコードを確認する
googleにはJSON-LDを確認する構造体チェッカーがあります。

構造化データテストツール
https://search.google.com/structured-data/testing-tool

作成したコードをチェッカーに通すと、
エラーがないかチェックをし、構造体を表形式で表示してくれます。

エラーは修正しなければなりませんが、
推奨値が設定されていない場合に表示される警告については、
それほど気にしなくてもよいと思われます。

###地図
求人を募集する法人の所在地ではなく、実際に働く場所をlocationPlaceに設定します。
MAPがちょっとしたことで表示されないという情報もありますが、
私が設定したもので表示されないことはありませんでした。

###会社の評判
いくつかの会社レビューサイトが表示される場合があります。
レビューサイト側に構造体が設定されていれば可能性がありますが、
どういったロジックで募集法人と結びついているのか、ちょっとわかりませんでした。
ナレッジ登録されていれば表示される・・のかな？

- カイシャの評判
- インディード
- キャリコネ

といったところが表示されるようです。

###validThrough 
募集期限を設定することができます。
推奨値なので設定しなくても可です。
設定してあり、期限を過ぎた場合速やかにページあるいはjson-ldを削除するようにとあります。
業界や職種によっては常時募集ということもあるかと思いますが、
信頼性を確保するためにも、
求人情報をマメに更新（再作成）した方が良さそうです。

#検索結果への反映
consoroleを使ってクロールを促すことができます。
authする必要があるため、
プロジェクトを作成し、キーを取得する必要があります。

sitemap.xmlへの追加だけだと、
反映されるまでに1週間ちょっとかかるイメージです。

#おわりに
googleのガイドラインを読みながら実施すれば対応はできます。
サードパーティーのデータの方が量が多いので、
自社サイトでの求人にどれだけたどりつけるか、効果はまだわかりません。
でもgoogle検索の結果に自社のロゴマークがでると、
ちょっとやったぞ！感があります。

何かを介しての求人と、
直接のやりとりと、
どちらを望むかは求職者によってちがってくると思いますので、
どちらものルートがあるということがよいのかもしれません。