2010-04-16 33 views
2

AJAX自動完成相當簡單。不過,我想知道如何處理SO這樣的智能標籤建議。標記建議(不標記自動完成)

爲了澄清自動完成建議之間的差:

  • 自動填充:FOO [foobar的,foobaz]
  • 建議:FOO [barfoo,foobar的,foobaz],或甚至更好,與'你的意思'功能:[barfoo,foobar,foobaz,fobar,fobaz]

我想我需要在標籤中進行全文搜索(所有字母都是索引的,而不僅僅是單詞)。對於有限數量的標籤(甚至客戶端)來說,使用正則表達式或其他模式不會有任何問題。

但如何實現大量標籤的這個功能?
是否有什麼特別的原因(除了URL)SO上的標籤是否被分隔?那麼標籤中的Unicode字符呢?

我將表中的標籤存儲在以下列中:id,tagname。 我的SQL查詢返回以下字段的對象:ID,標記名,算上

(我使用Doctrine ORM和pgsql的默認數據庫驅動程序)。

回答

3

我會去與每按鍵由REGEXP從數據庫中選擇他們。我在我的網站上這樣做,並沒有prefrormance問題(我沒有沉重的服務器思想)。如果您不喜歡這個想法,我會兌現所有1-5個字母的組合,用戶可以每天在單獨的表格中輸入並刷新它們。如果這張表被編入索引,那麼你的執行速度非常快。

更詳細地說明該第二appreach:

簡言之:1.表示betwean關鍵字1-n的關係的表SEARCHTABLE(它限制在3-4個字母)和標籤初級的ID。 2.兩個領域的指數。 3.每次用戶進行搜索時都要查看SEARCHTABLE,如果組合在那裏,請使用它 - 非常快,因爲所有內容都被編入索引。如果沒有執行正則表達式搜索並將所有結果都放到SEARCHTABLE中。

注:

  1. 如果 你添加標籤,您應該無效的表,但這應該多 少往往比搜索。當 無效表您不 necesarilly截斷它,你可以 輕鬆重建它考慮到所有 關鍵字考慮。
  2. 如果你想加快速度,你可以「預生成」所有兩個或甚至三個字母搜索 。
  3. 如果您足夠關心,您應該使用來自n-1個字母kewords的信息來生成 n字母關鍵字。它極大地加快了速度。假設用戶輸入了「mo」 ,並且您已經從SEARCHTABLE向他們顯示了適當的結果。當她輸入「n」 給它「mon」時,你只需要選擇已經選擇的項目產生新的 響應。

現在希望它更全面。

+0

您可以詳細說明沒有正則表達式的方法嗎? – takeshin 2010-04-25 13:34:09

+0

我已經詳細闡述了答案。 – gorn 2010-04-29 13:49:14

+0

謝謝你的解釋。 – takeshin 2010-05-05 21:00:58