사용자 페이지뷰 카운팅 (관리자 및 크롤러 제외)

여러분,

리포트에서 이 데이터를 찾을 수 없습니다. Data Explorer 플러그인을 사용 중인데, 크롤러 활동과 우리 포럼의 스태프 구성원을 제외하고 우리 사용자만 주간별로 집계하되, 익명 페이지뷰는 포함하는 Pageview 수를 가져오는 쿼리는 어떻게 작성해야 할까요?

  • 이런 식으로 작성하면 될까요?
  • 익명 뷰도 고려하게 될까요?
  • 또한 이걸 리포트로 변환하는 방법이 있을까요?
-- [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_id는 NULL이고 ip_address는 NOT 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 리포트의 통합 페이지뷰와 비교했을 때 익명 사용자를 과소 집계하고 있습니다.

다른 테이블들도 고려해야 할 것 같습니다.

페이지 뷰(Page Views) 보고서는 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 테이블은 사용자 또는 IP 주소별로, 주제별로, 일당 최대 1개의 항목을 반환합니다. 이 데이터는 페이지 뷰 추적을 위해 사용할 수 없습니다. 단일 주제 뷰에 대해 여러 개의 애플리케이션 요청이 있을 수 있기 때문입니다.

알겠습니다. 결국, 정확한 PV 수치를 얻으려면 스태프 사용자를 제외하는 것은 불가능하다는 말씀이군요.

한 번 물어보겠습니다. 특정 카테고리를 제외하는 것이 가능한가요? (아마 불가능할 것 같지만요) 저희는 팀 내부만 사용할 수 있는 비공개 카테고리가 몇 개 있는데, 그런 것들이 일반 사용자 PV 수치에 영향을 주지 않았으면 합니다.

application_requests 테이블이 제공하는 데이터에서 스태프를 제외하는 방법을 찾을 수 없습니다. 또한 해당 테이블의 결과를 카테고리별로 필터링하는 것도 불가능합니다. 사이트 사용량에 대한 데이터를 얻으려는 경우라면, 원래 쿼리에서 사용 중인 topic_views 테이블은 사이트가 어떻게 사용되고 있는지에 대한 정확한 데이터를 제공하지만, 이 데이터는 페이지 뷰 보고서에서 확인되는 수치와 일치하지 않습니다.