ユーザー(非スタッフ、非クローラー)のページビューをカウントする

みなさん、こんにちは。

レポートにこのデータが表示されません。Data Explorer プラグインを使用していますが、当社のユーザーのみを対象とした週ごとのページビュー数(クローラーの活動や当フォーラムのスタッフは除外し、匿名のページビューは含める)を取得するクエリをご教示ください。

  • 以下のようなクエリで機能しますか?
  • 匿名の閲覧は考慮されますか?
  • また、これをレポートに変換する方法はありますか?
-- [params]
-- string :date = '2020-01-01'

WITH t AS (
    SELECT date(:date) AS START
),
f AS (
    SELECT id as user_id
    FROM users u
    WHERE u.moderator = 'True' or u.admin = 'True'
)

    SELECT
    date_part('year', viewed_at) as year,
    date_part('week', viewed_at) as week,
    COUNT(topic_id) AS topics_viewed
    FROM topic_views, t
    WHERE viewed_at > t.START
        AND user_id not in (select f.user_id from f)
    GROUP BY year, week
    ORDER BY year, week

クエリは問題なく動作するように見えます。

はい、現在の記述では匿名ビューもカウントされています。トピックの匿名ビューの場合、user_idNULL になり、ip_addressNOT NULL になります。匿名ビューを除外するには、クエリに以下の条件を追加してください。

AND user_id IS NOT NULL

プラグインを通じて実現可能です。Discourse Solved プラグインは管理ダッシュボードにレポートを追加します。レポートの追加方法の例として、そのプラグイン内のコードが役立つ可能性があります:discourse-solved/plugin.rb at main · discourse/discourse-solved · GitHub

つまり、このような感じでしょうか?では、クローラーの場合、IP アドレスは null になりますか?

以下を含めたいです:

  • 匿名の閲覧者
  • ログイン中のユーザー

以下を除外したいです:

  • クローラー
  • スタッフユーザー
-- [params]
-- string :date = '2020-01-01'
-- boolean :staff = false

WITH t AS (
    SELECT date(:date) AS START
),
f AS (
    SELECT id as user_id
    FROM users u
    WHERE u.moderator = 'True' or u.admin = 'True'
)

    SELECT
    user_id,
--    date_part('year', viewed_at) as year,
--    date_part('week', viewed_at) as week,
    COUNT(topic_id) AS topics_viewed
    FROM topic_views, t
    WHERE viewed_at > t.START
    AND ((ip_address is not null AND user_id is NULL) OR
        user_id not in (select f.user_id from f))
    GROUP BY user_id
    ORDER BY topics_viewed DESC
    -- GROUP BY year, week
    -- ORDER BY year, week

上記は誤りです。Discourseレポートの統合ページビューと比較すると、匿名ユーザーの数が過少にカウントされています。

他のテーブルも考慮する必要があるかもしれませんか?

ページビューレポートは application_requests テーブルを照会します。ただし、そのテーブルにはスタッフの表示を除外するためのデータは含まれていません。返されるのは、日付ごとの各タイプのリクエスト数の合計です。req_type は整数として返されます。これらの整数は、以下のルールに基づいてリクエストの種類にマッピングされます。

"http_total" => 0,
"http_2xx" => 1,
"http_background" => 2,
"http_3xx" => 3,
"http_4xx" => 4,
"http_5xx" => 5,
"page_view_crawler" => 6,
"page_view_logged_in" => 7,
"page_view_anon" => 8,
"page_view_logged_in_mobile" => 9,
"page_view_anon_mobile" => 10

クエリで使用している topic_views テーブルは、1 日あたりトピックごとにユーザーまたは IP アドレスあたり最大 1 件のエントリを返します。このデータはページビューの追跡には使用できません。単一のトピックビューに対して複数のアプリケーションリクエストが存在する可能性があるためです。

なるほど。つまり、スタッフユーザーを除外しないと正確な PV 数は得られないということですね。

無理な質問かもしれませんが、特定のカテゴリを除外することは可能でしょうか(おそらく不可能だと思いますが)。チーム内部専用のプライベートカテゴリがいくつかあり、それらがユーザーの PV 数に混入してしまうことを避けたいと考えています。

application_requests テーブルから提供されるデータからスタッフを除外する方法は確認できませんでした。また、このテーブルの結果をカテゴリでフィルタリングすることもできません。サイトの利用状況に関するデータを取得しようとしている場合、元のクエリで使用している topic_views テーブルは、サイトがどのように利用されているかに関する正確なデータを提供しますが、そのデータは「ページビュー」レポートに表示されている内容と一致しません。