从搜索记录中获取搜索量最高的字词,而忽略任何用户在给定时间范围(Hrs)内重复输入的搜索字词

时间:2019-04-06 16:46:31

标签: mysql sql mysql-5.7

我们目前正在从以下实体中抽取前5天的搜索结果,这些实体按搜索次数排序,以进行最近N天的搜索(请参阅下面的查询中的有效搜索日期)。

SELECT *, count(t.searchterms)
FROM searchRecords t
WHERE t.SearchDate >= effectiveSearchDate   
GROUP BY t.searchTerms  
ORDER BY count(t.searchTerms) DESC
LIMIT 5;

在这里, effectiveSearchDate是您要从顶部开始搜索直到日期的日期,对于最近5天以来的顶部搜索结果说'2019-04-01 00:00:00'

请参阅下面的图像。 enter image description here

现在,为了避免搜索垃圾邮件(任何用户连续多次搜索特定词只是为了使它出现在顶部搜索中),我们在此现有实体中引入了userId列,并希望更新查询它将忽略用户在指定时间段(例如2小时)内针对特定搜索词的任何此类垃圾邮件搜索。

例如:让我们进一步分析上方搜索量最高的术语-“投票日”:

选择*从SearchRecords  搜索字词是“投票日”;

enter image description here

在这里,如果您仅注意到这3个用户多次搜索了此关键字。因此,我们希望舍弃用户在n-Hrs(例如2小时)的指定时间段内进行的多次搜索,即将用户在2小时内对某个特定字词的所有搜索都计为一个(1)。 ,此搜索词的最终计数-“投票日” 应该是 3 而不是 12 ,并且对于所有搜索计数都应类似。

1 个答案:

答案 0 :(得分:0)

让我们先编写逻辑方法-

使用ROW_NUMBER()添加新列“ valid_search_flag”,逻辑应为

分区依据-

  • 用户ID
  • searchterm
  • 搜索日期的日期部分('yyyy-MM-dd')
  • 由3划分的searchdate('HH')的小时部分(此处3定义了3个小时的时间范围)

订购者-

  • 搜索日期

生成 valid_search_flag 的逻辑为:

  

ROW_NUMBER()OVER(按用户ID,搜索词,FORMAT(搜索日期,   'yyyy-MM-dd'),FORMAT(searchdate,'hh')/ 3 ORDER BY searchdate)AS    valid_search_flag

现在使用过滤器“ valid_search_flag = 1”可以过滤所有重复的搜索:

WITH CTE AS (SELECT *, 
            ROW_NUMBER() OVER(PARTITION BY userid,searchterm, FORMAT(searchdate, 'yyyy-MM-dd'), FORMAT(searchdate, 'hh')/3 ORDER BY searchdate) AS valid_search_flag
            FROM test.test
            )
SELECT * 
FROM CTE
WHERE valid_search_flag=1

现在,您可以运行聚合查询。

我已经在SQL Server上成功测试了此功能,请进行以下更改以在mySQL中执行此操作-

(a)格式(searchdate,'yyyy-MM-dd')-> GET_FORMAT(searchdate,'yyyy-MM-dd')

(b)格式(搜索日期,“ hh”)/ 3 -> 小时(搜索日期)/ 3