2011-09-13 73 views
2

問題是:如何根據搜索時間和搜索次數對我的Web應用程序中的搜索查詢中使用的關鍵字進行排名?排名搜索關鍵字

用戶在文本框中鍵入他的搜索查詢。通過AJAX我需要向用戶返回一些建議。這些建議是基於搜索數爲該關鍵字完成的,應該按排序,最近的搜索次數爲

例如,如果用戶輸入搜索詞作爲「掛起」,則建議應該按以下順序:「宿醉部分2」,「宿醉」。

我應該如何設計數據庫來存儲搜索查詢?我應該如何編寫sql查詢來獲取建議?

回答

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. 提供的解決方案只會建議以用戶查詢開始的查詢。像:

    「女士」=> [ 「夫人加加」, 「夫人XYZ」]

查詢 「夫人」 將不匹配 「加加女士」。對於他們來說,您需要通過數據庫的全文搜索支持或外部庫(如Lucene)進行查詢索引。

+0

@Jeyanth Kumar:你爲什麼接受這個答案? Felipe沒有解決如何通過「最近搜索」排序結果。 I.E.如果有更多搜索,「宿醉」將永遠在「宿醉2」之前。只是在說! – Briguy37

+0

@ Briguy37:您可以輕鬆地通過「重置」查詢計數字段一次。您可以存儲一個用於所有時間查詢計數的列/字段和另一個用於今天的查詢計數等。關於如何實現它的概念是相同的。 –

0

你需要類似自動暗示的東西嗎?有一個名爲autocomplete的JQuery插件只在用戶輸入字母時纔會查找類似的單詞。但是,如果您想根據用戶搜索關鍵字的次數來獲取建議,那麼您需要將關鍵字存儲在單獨的表中,然後稍後爲其他用戶獲取關鍵字?

1

理想情況下,你會排序類似如下:

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

這將不得不進行修改,以便在多久以前是在一個適當的基準時間的基礎。例如,如果您希望搜索在一週後計算爲一半,則會使一週= 1。

這顯然效率不高,因爲計算多久之前每個搜索都針對所有搜索結果執行的時間將是時間耗時。因此,您可能希望爲每次搜索保留一個運行總數,並將每個時間段的總數乘以某個值。例如,如果您希望搜索在一週後計算爲一半,那麼您將爲每個搜索添加一個到該列。然後,您將擁有一個每週將搜索列乘以.5的進程。然後你只需在那一欄上排序。