omuriceman's blog

iOS / AWS / Firebase / JavaScript / Deep Learning を中心とした技術を面白く紹介します!

【個人利用】Amazon Cloud Searchで技術書典6のサークル情報(ジャンル詳細/タグ)を全文検索できるツールを作成しました。

開催も間近に迫った技術書典6ですが、サークル数が多くて欲しい本を探すのが大変!なんてことありませんか? もっと効率的に探すことはできないかな〜と思った私は前から使って見たかったAmazon Cloud Searchを利用して、技術書典APIからローカルにダウンロードしたjsonAmazon Cloud Search利用して検索できるようにしました! Amazon Cloud Searchって実装するのにわかりやすいドキュメントがなかったんで、その助けにもなればいいかなと思っております!

【注意】技術書典さまにご迷惑になるので公開はしておりません!

サイトのイメージはこちら!

f:id:omuriceman:20190411134108g:plain
操作イメージ
タグ経由からも検索できるようにして、タグからタグへと渡って行くのが楽しいです!w ちなみに先日ご紹介した、漫画の記事もいくつかこちらで調べました!

omuriceman.hatenablog.com

下準備

Amazon Cloud Searchを使用するまでに下準備が必要です。順を追って紹介していくので、確認していってくださいませ。

技術書典のAPIを調査する

まずは検索対象となるAPIを調べます。詳細は割愛いたしますが、 技術書典さまにご迷惑にならないよう出力結果をjsonファイルとしてローカルに落としておきます。

【重要】APIjsonをコンバートする

さてAmazon Cloud Searchではindexの作成とデータを投入するにあたり、Amazon Cloud Search側で受け付けるためのデータフォーマットがあります。 Amazon Cloud Searchを使うのは初めてだったのでここの概念を理解するために時間を消費してしまいました。 公式ページをご紹介させていただきます。公式ページの紹介している方法に合わせてjsonデータを整形しましょう。

Amazon CloudSearch 用にデータを準備 - Amazon CloudSearch

元の技術書典のAPIで取得できるjson構造はこのような形です。

[
    {
        "id": "34330004",
        "name": "六木本未来ラボ",
        "nameRuby": "ロッキボンミライラボ",
        "penName": "六木本未来ラボ所属研究員一味",
        "genre": "software",
        "genreFreeFormat": "AWS脱初心者向け記事をいくつかのテーマで掲載します!",
        "tags": [
            "AWS",
            "React",
            "サーバーレス",
            "Amplify",
            "JavaScript",
            "PHP",
            "AWSDevDay",
            "クラウド",
            "インフラ",
            "Webサーバ",
            "セキュリティ",
            "コスト",
            "CI",
            "CI/CD",
            "Lambda",
            "体験談"
        ]
    }
    ***中略***
]

それを下記のように変換かけます。

[
    {
        "id": "34330004", //必須
        "type": "add", //なくてもいい。
        "fields": { //必須
            "name": "六木本未来ラボ",
            "genre": "AWS脱初心者向け記事をいくつかのテーマで掲載します!",
            "tags": [
                "AWS",
                "React",
                "サーバーレス",
                "Amplify",
                "JavaScript",
                "PHP",
                "AWSDevDay",
                "クラウド",
                "インフラ",
                "Webサーバ",
                "セキュリティ",
                "コスト",
                "CI",
                "CI/CD",
                "Lambda",
                "体験談"
            ]
        }
    }
]

ここで改めてポイントを記載します。

  • id/fieldsは必須。typeはなくてもいい。がない場合はaddと認識されている。
  • トップは[]で囲む必要がある。
  • fieldsは深い階層のデータはAmazon Cloud Search側が認識してくれないらしいので、ネストしているデータを利用している場合はフラットな構造に変換する。そうしない場合はAmazon Elasticsearchを使用する選択肢もある

です。今後自分が使うときにも見直したいと思います!

Amazon Cloud Searchを利用する

Create a New Domainでプロジェクト作成

f:id:omuriceman:20190410215617p:plain

Search Domain Nameは自由につけてもらって構いません。 Desired Instance Type / Desired Replication CountもUse defaultのまま進めてください。 商用で使う場合などは見直してくださいね!

index対象となるサンプルファイルをアップロード

f:id:omuriceman:20190410215847p:plain

いろんな方法でファイルをアップロードできます。 先ほどコンバートしたファイルをローカルからアップロードしてもいいですし、一度S3にバケットを作成しそれを参照する形でも構いません。 Amazon CloudSearch 用にデータを準備 - Amazon CloudSearch

言語の部分を変更する

f:id:omuriceman:20190410220132p:plain

jsonのファイル形式が正しい場合は、上記のように自分で作成したkeyが画面上に表示されていると思います。 ここで他の属性が表示されている場合、jsonファイルの作成がうまくできていないケースが考えられます。

Analysis Schemeの項目が言語設定になっているのですが、Japaneseを選択するのを忘れないようにしてください。

作成が始まったらちょっと待つ

インデックス作成に10分くらいかかります。気長に待ちましょう。

ACTIVEになったら検索用のドキュメントをアップロードする

【注意】ここでアップロードするファイルにエスケープ文字(\nとか\bとか)があるとアップロードエラーになります。今回、そのエラーが発生してしまって試行錯誤しましたが、エスケープ文字の数が少なかったため手作業で削除しました。

Run a Test Searchで検索する

アップロードが完了すると、管理画面上で検索を開始できるようになります。 Amazon Cloud Searchでは検索ワードに関連性があるものが上から順に表示されるようになっております。

f:id:omuriceman:20190410212410p:plain
AWS」の検索結果

なんと!!19位中10位!!低い!

CLI経由で検索する

次はコマンドラインから検索できないか試して見ましょう。 URLはDashboardに載っています!

$ curl https://search-hogehoge.ap-northeast-1.cloudsearch.amazonaws.com/2013-01-01/search?q=AWS 

コンソール上にjson形式の情報が出力されていれば成功です。 うまく行かない場合はAmazon Cloud Searchの権限の影響もあるのでご確認ください。

Webサイトを作成する

最後はWebからでも閲覧ができるように、ページを作成します。 最近東京リージョンがリリースされた、Amplify ConsoleAmplify API + AWS LambdaReact.jsなどを利用しておりますが、 今回は時間の関係上割愛させていただきます。別の機会にご紹介させていただきます! 一つだけ言いたいのは、

Amplify Consoleはとても便利です!!!

どんなキーワードが人気があるのか調査してみた!?

すごく面白いことに、「世間的に流行っている技術」と「販売されている本の検索結果数」が関連性があるように思えます。

javascriptフレームワーク人気調査

  • Vue 13件
  • Angular 3件
  • React 14件

言語人気調査

クラウドサービス人気調査

  • GCP 11件
  • AWS 24件
  • Azure 8件

面白かった結果

  • 成長 1件
  • 挫折 2件

皆さんはどう思いましたか?私は技術書典が時代を反映している!と感じました。

最後に

私どものサークルも興味があれば是非お越しくださいませ! techbookfest.org

json変換用のコンバーターのサンプルはこちらです。
GitHub - wataruiijima/tbf6converter