排名搜索关键字

时间:2011-09-13 14:31:24

标签: mysql database-design search information-retrieval

问题是:如何根据搜索时间和数量对我的网络应用程序中搜索查询中使用的关键字进行排名?

用户在文本框中键入其搜索查询。通过AJAX,我需要向用户返回一些建议。这些建议基于对该关键字执行的搜索次数,并应按最近搜索进行排序。

例如,如果用户将搜索字词输入为“挂起”,则建议应按以下顺序排列:“宿醉部分2”,“宿醉”。

我应该如何设计数据库来存储搜索查询?我应该如何编写sql查询来获取建议?

3 个答案:

答案 0 :(得分:3)

对于查询建议,一个好方法是计算每个搜索查询的出现次数(最好不要计算同一用户进行的重复查询)。你将有一个文件/表/东西(查询,计数),如下所示:

"britney spears" 12
"kelly clarkson" 5
"billy joel" 27
"query abcdef" 2
"lady gaga" 39
...

然后您可以按发生的降序排序:

"lady gaga" 39
"billy joel" 27    
"britney spears" 12
"lady xyz" 5
"query abcdef" 2
...

然后当有人搜索"lady"时,对文件/表格/顶部的所有字符串进行前缀搜索。如果您只想提出K个建议,则只有在找到Top-K建议后才能使用。

您可以使用简单文件实现此功能,或者您也可以使用计数查询表并执行类似以下的查询:

SELECT q.query from (SELECT * from search_queries order by query_count DESC) as q where q.query LIKE "prefix%" LIMIT 0,K

两个注释:

  1. 有更好(也更困难)的方法。例如,亚马逊有一个非常好的查询建议。
  2. 提供的解决方案仅建议以用户查询开头的查询。像:

    “lady”=> [“lady gaga”,“lady xyz”]

  3. 查询“女士”与“gaga女士”不符。要使它们匹配,您需要通过数据库的全文搜索支持或Lucene等外部库来查询索引。

答案 1 :(得分:1)

理想情况下,您可以选择以下内容:

order by sum(# of searches / (how long ago that search was performed + 1))

这必须进行修改,以便多久以前可以基于适当的基准时间。例如,如果您希望搜索在一周后计算为一半,则您将使一周= 1。

这显然效率低下,因为计算对所有搜索结果执行每次搜索的时间很长。因此,您可能希望为每个搜索保留一个运行总计,并将每个时间段的总计乘以某个值。例如,如果您希望搜索在一周后计算为一半,则每次搜索都会向该列添加一个搜索。然后,您将拥有一个每周将搜索列乘以.5的过程。然后你只需对该列进行排序。

答案 2 :(得分:0)

你需要像自我暗示这样的东西吗?有一个名为autocomplete的JQuery插件,只有在用户输入字母时才会查找相似的单词。但是,如果您想根据用户搜索关键字的次数获取建议,那么您需要将关键字存储在单独的表中,然后再为其他用户提取吗?