An Interest In:
Web News this Week
- April 19, 2024
- April 18, 2024
- April 17, 2024
- April 16, 2024
- April 15, 2024
- April 14, 2024
- April 13, 2024
April 19, 2024 11:59 am GMT
Original Link: https://dev.to/minddd64/understanding-search-functionality-58bn
Understanding Search Functionality
Questions before we create the function
- Why does this function make the product better?
- How can we measure the effect of the function quantitatively?
- How long does it take to create the function
- Does this function make the product too complicated?
- How dangerous is the function?
- How innovative is the function?
- Is it aligned with what users want?
Hypothesis that we need to check
- Do users use the search function a lot? Among the numerous functions used by users, how commonly is the search function?
- How often do users use the search function in one session?(It might be a problem if they use it too often or too rarely)
- How much do results clicks occur after searching?
- where is the results that is clicked after a search?
- The more users search, the more click they do?
- What is the retention rate of the search function users?
Data Analysis
1. Percentage of search function usage
SELECT DATE_TRUNC('week', z.session_start) AS week, COUNT(*) AS sessions, COUNT(CASE WHEN z.autocompletes > 0 THEN z.session ELSE NULL END) AS with_autocompletes, COUNT(CASE WHEN z.runs > 0 THEN z.session ELSE NULL END) AS with_runsFROM (SELECT x.session_start, x.session, x.user_id, COUNT(CASE WHEN x.event_name = 'search_autocomplete' THEN x.user_id ELSE NULL END) AS autocompletes, COUNT(CASE WHEN x.event_name = 'search_run' THEN x.user_id ELSE NULL END) AS runs, COUNT(CASE WHEN x.event_name LIKE 'search_click_%' THEN x.user_id ELSE NULL END) AS clicksFROM (SELECT e.*, session.session, session.session_startFROM tutorial.yammer_events eLEFT JOIN (SELECT user_id, session, MIN(occurred_at) AS session_start, MAX(occurred_at) AS session_endFROM(SELECT bounds.*, CASE WHEN last_event >= INTERVAL '10 MINUTE' THEN id WHEN last_event IS NULL THEN id ELSE LAG(id, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) END AS sessionFROM (SELECT user_id, event_type, event_name, occurred_at, occurred_at - LAG(occurred_at, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) AS last_event, LEAD(occurred_at, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) - occurred_at AS next_event, ROW_NUMBER() OVER() AS idFROM tutorial.yammer_events eWHERE e.event_type = 'engagement'ORDER BY user_id, occurred_at) boundsWHERE last_event >= INTERVAL '10 MINUTE' OR next_event >= INTERVAL '10 MINUTE' OR last_event IS NULL OR next_event IS NULL) finalGROUP BY user_id, session) sessionON e.user_id = session.user_id AND e.occurred_at >= session.session_start AND e.occurred_at <= session.session_endWHERE e.event_type = 'engagement') xGROUP BY x.session_start, x.session, x.user_id) zGROUP BY week
2. The number of sessions with autocompletes
SELECT autocompletes, COUNT(*) AS sessionsFROM (SELECT x.session_start, x.session, x.user_id, COUNT(CASE WHEN x.event_name = 'search_autocomplete' THEN x.user_id ELSE NULL END) AS autocompletes, COUNT(CASE WHEN x.event_name = 'search_run' THEN x.user_id ELSE NULL END) AS runs, COUNT(CASE WHEN x.event_name LIKE 'search_click_%' THEN x.user_id ELSE NULL END) AS clicksFROM (SELECT e.*, session.session, session.session_startFROM tutorial.yammer_events eLEFT JOIN (SELECT user_id, session, MIN(occurred_at) AS session_start, MAX(occurred_at) AS session_endFROM(SELECT bounds.*, CASE WHEN last_event >= INTERVAL '10 MINUTE' THEN id WHEN last_event IS NULL THEN id ELSE LAG(id, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) END AS sessionFROM (SELECT user_id, event_type, event_name, occurred_at, occurred_at - LAG(occurred_at, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) AS last_event, LEAD(occurred_at, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) - occurred_at AS next_event, ROW_NUMBER() OVER() AS idFROM tutorial.yammer_events eWHERE e.event_type = 'engagement'ORDER BY user_id, occurred_at) boundsWHERE last_event >= INTERVAL '10 MINUTE' OR next_event >= INTERVAL '10 MINUTE' OR last_event IS NULL OR next_event IS NULL) finalGROUP BY user_id, session) sessionON e.user_id = session.user_id AND e.occurred_at >= session.session_start AND e.occurred_at <= session.session_endWHERE e.event_type = 'engagement') xGROUP BY x.session_start, x.session, x.user_id) zGROUP BY autocompletes
3. The number of sessions with full search
SELECT runs, COUNT(*) AS sessionsFROM (SELECT x.session_start, x.session, x.user_id, COUNT(CASE WHEN x.event_name = 'search_autocomplete' THEN x.user_id ELSE NULL END) AS autocompletes, COUNT(CASE WHEN x.event_name = 'search_run' THEN x.user_id ELSE NULL END) AS runs, COUNT(CASE WHEN x.event_name LIKE 'search_click_%' THEN x.user_id ELSE NULL END) AS clicksFROM (SELECT e.*, session.session, session.session_startFROM tutorial.yammer_events eLEFT JOIN (SELECT user_id, session, MIN(occurred_at) AS session_start, MAX(occurred_at) AS session_endFROM(SELECT bounds.*, CASE WHEN last_event >= INTERVAL '10 MINUTE' THEN id WHEN last_event IS NULL THEN id ELSE LAG(id, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) END AS sessionFROM (SELECT user_id, event_type, event_name, occurred_at, occurred_at - LAG(occurred_at, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) AS last_event, LEAD(occurred_at, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) - occurred_at AS next_event, ROW_NUMBER() OVER() AS idFROM tutorial.yammer_events eWHERE e.event_type = 'engagement'ORDER BY user_id, occurred_at) boundsWHERE last_event >= INTERVAL '10 MINUTE' OR next_event >= INTERVAL '10 MINUTE' OR last_event IS NULL OR next_event IS NULL) finalGROUP BY user_id, session) sessionON e.user_id = session.user_id AND e.occurred_at >= session.session_start AND e.occurred_at <= session.session_endWHERE e.event_type = 'engagement') xGROUP BY x.session_start, x.session, x.user_id) zGROUP BY runs
4. Distribution of the clickthrough after full search
SELECT clicks, COUNT(*)FROM (SELECT x.session_start, x.session, x.user_id, COUNT(CASE WHEN x.event_name = 'search_autocomplete' THEN x.user_id ELSE NULL END) AS autocompletes, COUNT(CASE WHEN x.event_name = 'search_run' THEN x.user_id ELSE NULL END) AS runs, COUNT(CASE WHEN x.event_name LIKE 'search_click_%' THEN x.user_id ELSE NULL END) AS clicksFROM (SELECT e.*, session.session, session.session_startFROM tutorial.yammer_events eLEFT JOIN (SELECT user_id, session, MIN(occurred_at) AS session_start, MAX(occurred_at) AS session_endFROM(SELECT bounds.*, CASE WHEN last_event >= INTERVAL '10 MINUTE' THEN id WHEN last_event IS NULL THEN id ELSE LAG(id, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) END AS sessionFROM (SELECT user_id, event_type, event_name, occurred_at, occurred_at - LAG(occurred_at, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) AS last_event, LEAD(occurred_at, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) - occurred_at AS next_event, ROW_NUMBER() OVER() AS idFROM tutorial.yammer_events eWHERE e.event_type = 'engagement'ORDER BY user_id, occurred_at) boundsWHERE last_event >= INTERVAL '10 MINUTE' OR next_event >= INTERVAL '10 MINUTE' OR last_event IS NULL OR next_event IS NULL) finalGROUP BY user_id, session) sessionON e.user_id = session.user_id AND e.occurred_at >= session.session_start AND e.occurred_at <= session.session_endWHERE e.event_type = 'engagement') xGROUP BY x.session_start, x.session, x.user_id) zWHERE runs > 0 GROUP BY clicks
- After full search, zero clickthrough is more than half.
SELECT runs, AVG(clicks) ::FLOAT AS average_clicksFROM (SELECT x.session_start, x.session, x.user_id, COUNT(CASE WHEN x.event_name = 'search_autocomplete' THEN x.user_id ELSE NULL END) AS autocompletes, COUNT(CASE WHEN x.event_name = 'search_run' THEN x.user_id ELSE NULL END) AS runs, COUNT(CASE WHEN x.event_name LIKE 'search_click_%' THEN x.user_id ELSE NULL END) AS clicksFROM (SELECT e.*, session.session, session.session_startFROM tutorial.yammer_events eLEFT JOIN (SELECT user_id, session, MIN(occurred_at) AS session_start, MAX(occurred_at) AS session_endFROM(SELECT bounds.*, CASE WHEN last_event >= INTERVAL '10 MINUTE' THEN id WHEN last_event IS NULL THEN id ELSE LAG(id, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) END AS sessionFROM (SELECT user_id, event_type, event_name, occurred_at, occurred_at - LAG(occurred_at, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) AS last_event, LEAD(occurred_at, 1) OVER (PARTITION BY user_id ORDER BY occurred_at) - occurred_at AS next_event, ROW_NUMBER() OVER() AS idFROM tutorial.yammer_events eWHERE e.event_type = 'engagement'ORDER BY user_id, occurred_at) boundsWHERE last_event >= INTERVAL '10 MINUTE' OR next_event >= INTERVAL '10 MINUTE' OR last_event IS NULL OR next_event IS NULL) finalGROUP BY user_id, session) sessionON e.user_id = session.user_id AND e.occurred_at >= session.session_start AND e.occurred_at <= session.session_endWHERE e.event_type = 'engagement') xGROUP BY x.session_start, x.session, x.user_id) zWHERE runs > 0 GROUP BY runs
- The more users search, the more they click
- Above 13 runs, the amount of sessions decreased -> not accurate
5. The order of clicked contents
SELECT event_name, COUNT(user_id)FROM tutorial.yammer_eventsWHERE event_name LIKE 'search_click_result_%'GROUP BY event_nameORDER BY event_name
- The order of contents that users click is distributed.
- In chart 4, users who click only one result is 2.45%. It implies that it's not the matter of ranking, but the matter of results itself.
Original Link: https://dev.to/minddd64/understanding-search-functionality-58bn
Share this article:
Tweet
View Full Article
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To