Google Analytics で サイト内検索キーワードをtrackingしよう

実はGoogle Analytics のview 設定を行うだけで、サイト内検索キーワードのtrackingが出来てしまいます。 サイト内検索を設定して検索データを確認する

設定方法

管理 > ビューの設定 より
「サイト内検索のトラッキング」をオンにして、クエリパラメータを設定するだけです。
f:id:rochefort:20161104031918p:plain

先日、Ransackで検索を実装し、 RansackのURLを変更を行いました。 これにより、以下のようにクエリがシンプルになりました。

# before
?utf8=✓&q%5Btitle_or_description_cont%5D=test

# after
?q=test

ですので、GAのクエリパラメータ設定に「q」を入れるだけで良いです。

POSTは?

GETベースの検索であれば上記のようにパラメータ設定するだけです。 ヘルプにも記載されていますが、POSTベースの場合はurlに付与するか、 analytics.js の機能を使って送信する必要があるのでここは注意が必要です。
サイト内検索を設定して検索データを確認する

余談

あまり実用的ではないですが、hatena blog のキーワード検索も、パラメータはqなので同様の設定でtrackingできます。
こんな感じ。
f:id:rochefort:20161104032019p:plain

RansackのURLを変更する方法

ransack で複数カラムを検索する - rochefort's blog の続きです。
f:id:rochefort:20161102004719p:plain

ransack で title と description カラムを検索するようにしたのですが、
URLが微妙です。
 
こんな感じ。

?utf8=✓&q%5Btitle_or_description_cont%5D=test

やりたいこと

  1. utf8を消したい
  2. q[title_or_description_cont]= を q= にしたい

1.utf8を消したい

こちらが詳しいです。
Rails の utf8=✓ の歴史と消し方と snowman ☃ - Qiita

IE5-8 対応として入れられたものだそうですが、この辺りのサポートもどうでもいいので
パラメータから削除しました。

search_form_for (form_for) の optionに enforce_utf8: false を追加すればokです。

2. q[title_or_description_cont]= を q= にしたい

要望としては、複雑な検索ロジックではないので、simpleなクエリにしたいです。
 
公式のパラメータを変更する方法としては、以下のような as で設定する方法がwikiに記載されていますが この方法だと、title_or_description_cont のところを変更するようなので、 欲しいものとは違うようです。
Configuration · activerecord-hackery/ransack Wiki

<%= f.search_form_for @search, as: :log_search %>
<%= sort_link(@search) %>

 
 
search_form_for を使う限り q[xxxx] となってしまうようなので 思い切って form_tag でformを生成し、controllerで ransack の形式にparamsを修正することで対応してみました。

view

before
search_form_for を使っています。

<%= search_form_for(@q, enforce_utf8: false) do |f| %>
  <div>
    <%= f.text_field :title_or_description_cont, placeholder: "検索" %>
    <%= f.submit %>
  </div>
<% end %>

after
form_tag に変更です。qをget で渡すようにします。

<%= form_tag(videos_path, method: :get, enforce_utf8: false) do %>
  <div>
    <%= text_field_tag :q, params[:q], placeholder: "検索" %>
    <%= submit_tag %>
  </div>
<% end %>

controller

before
ransack に params[:q]を渡すだけでした。

@q = Video.published.ransack(params[:q])
@videos = @q.result.page(params[:page])

after
params[:q]title_or_description_cont をkeyにしたhashとしてransackに渡しています。

query = { title_or_description_cont: params[:q] }
q = Video.published.ransack(query)
@videos = q.result.page(params[:page])

これで以下のようになります。

?q=test

ransack で複数カラムを検索する

activerecord-hackery/ransack を使ってみました。

Gemfileに書いて、検索ロジックをちょろっと変更して、viewをちょろっと修正すれば
検索画面がすぐできちゃう優れものです。
詳細はactiverecord-hackery/ransack

 

複数のカラムで検索させる方法

例えば title と description を検索対象にしたい場合はどうするのか?
簡単すぎで拍子抜けました。

view
viewのname属性を or でつなげておくだけ。
title_or_description_cont としておけば良いです。簡単!

<%= f.text_field :title_or_description_cont, class: "form-control", placeholder: "検索" %>

controller

    def index
      @q = Article.published.ransack(params[:q])
      @articles = @q.result.page(params[:page])
    end

生成されるSQL

logger.info Article.published.ransack(params[:q]).result.to_sql
SELECT "Articles".* FROM "articles" WHERE "articles"."status" = 1 
AND ("articles"."title" LIKE '%テスト%' OR "articles"."description" LIKE '%テスト%') 
ORDER BY "articles"."created_at

余談

これもgithubに書かれていますが、現在は、ransack/search どちらでも動作します。

Article.ransack(params[:q])
Article.search(params[:q])

が、searchメソッドは Ransack (2.0) で deprecated となる予定なので ransack を使っとくのが吉です。