2014/09/24

Google Custom Search を使って評価の低い(高い)レビューを検索する

前回記事に続き、Google Custom Search API を使って、もっと詳細に条件を指定する方法をメモ。

Google Custom Searchの公式ドキュメントによると、構造化データの情報を指定して、さらにフィルタリングができるみたい。

To filter by attribute, add a more:pagemap:TYPE-NAME:VALUE operator to a search query.

とあるので、検索キーワードに、more:pagemap:属性名:属性値を追加すればOK。

APIの戻り値を見てみると、価格.comのレビューの評価数の属性値は、review-ratingstarsでとれるので、例えば、評価数3のレビューのみ取得したい場合は、検索キーワードmore:pagemap:review-ratingstars:3.0とすることで、フィルタリングすることができる。また、値をカンマで区切る事でOR条件も指定できる。例えば、評価4と5も含めたい場合はmore:pagemap:review-ratingstars:3.0,4.0,5.0と書ける。前回のフォームに、評価数を指定するプルダウンを設置してみた。ソースはこんな感じ。

入力フォーム

<form class="form-horizontal" role="form" action="search" method="post">
    <div class="form-group">
      <label class="col-sm-2 control-label" for="keyword">キーワード</label>
      <div class="col-sm-10">
        <input type="text" id="keyword" name="keyword" class="form-control" >
      </div>
    </div>
    <div class="form-group">
      <label for="stars" class="col-sm-2 control-label">評価</label>
      <div class="col-sm-10">
        <select class="form-control" id="stars" name="stars">
          <option value="">指定しない</option>
          <option value="1.0">★☆☆☆☆</option>
          <option value="2.0">★★☆☆☆</option>
          <option value="3.0">★★★☆☆</option>
          <option value="4.0">★★★★☆</option>
          <option value="5.0">★★★★★</option>
        </select>
      </div>
    </div>
    <button type="submit" class="btn btn-primary">検索</button>
</form>

リクエストハンドラ 

#!-*- coding:utf-8 -*-
#!/usr/bin/env python
import json
import logging
import urllib
from google.appengine.api import urlfetch
from lib.controller import *

class Top(Controller):
    def get(self):
        self.draw_template('front/cse/top.html')

class Search(Controller):
    def post(self):
        # キーワードを得る
        keyword = self.request.get('keyword')
        # 評価が指定されていればキーワードに追加
        stars = self.request.get('stars')
        if stars:
            keyword += ' ' + 'more:pagemap:review-ratingstars:%s' % stars
        # urlエンコード
        keyword = urllib.quote(keyword.encode('utf-8'))
        # リクエストパラメータ組み立て
        url = 'https://www.googleapis.com/customsearch/v1'
        url += '?key=%s' % 'YOUR_API_KEY'
        url += '&cx=%s' % '000122034385005128488:etmrnaufuww'
        url += '&q=%s' % keyword
        # 検索
        result = urlfetch.fetch(url)
        logging.info(url)
        items = list()
        if not 200 <= result.status_code <= 299:
            # エラー
            logging.error('google custom search error: %s' % str(result.status_code))
            logging.error(result.content)
        else:
            # 結果を得る
            content_dict = json.loads(result.content)
            items = content_dict.get('items', list())
        self.set_template_value('items', items)
        self.draw_template('front/cse/search.html')

url_map = [
    ('/cse/top', Top),
    ('/cse/search', Search),
]
application = webapp.WSGIApplication(url_map, debug=True)

ちなみにAPI越しじゃなくても、Custom Search の追加キーワードでも指定できるみたい。ただ、この属性名がreview-ratingstarsとなっているのが、Google独自の命名なのか、構造化ルールでの命名なのかが不明。。。このあたりはもう少し調べてみます。

0 件のコメント:

コメントを投稿