2011-08-08 37 views
0

我們有文本(存儲在MSSQL數據庫)的大文件,我們需要提供像字典查找單詞時,他們上空盤旋。高亮顯示文本,並提供defintions在.NET

例如,如果有如下語句: 「快速狗跳過了棕色狐狸」我們的用戶可以創建任何的那些詞,如「快速」,「狗」一個「定義」,「躍過「等等,我們需要突出顯示這些文本,並在鼠標懸停時提供已定義的文本。

目前我們有一個執行工作,但它遭受了令人難以置信的糟糕的性能,當前的實現使用正則表達式來解析文本,並在文本中的詞後面插入一段JavaScript代碼,如果它符合定義。現在我們可以在任何地方看到400個或更多的定義,並且文本可以是幾段或更長的段落,這會掛起整個服務器,並使應用程序無法宣傳。

我試圖用正則表達式編譯擺弄優化的代碼,但它不利於問題的多了,請求仍然超時返回任何東西之前。

我很好奇,我一定要實現這個什麼其他選擇。

我已經考慮:

  • 寫作,坐在在後臺輪詢 定義,並在空閒時間更新文本
  • 緩存的一些形式的服務,然而,這是不是真的要解決這個問題,人類作爲站點不會加載的根本原因 在所有的頁面 可能不會獲取緩存
  • 實現正則表達式的客戶端,我想頁面將加載然後 但我懷疑這樣做客戶端會有什麼比做得 服務器端更好的甚至可能鎖住瀏覽器

應用程序是一個ASP.NET網站(.NET 3.5目前移動至4 soonish),使用SQL Server 2005/8(視在客戶端網站上)和NHibernate。

+0

在我看來,這樣做,早期是一個錯誤的工作。爲什麼不在客戶端實際請求時抓住服務器端的定義?當用戶突出顯示時,進行AJAX調用或獲取定義。 – Jeremy

+0

我認爲,但我們確實需要預先突出一個字,表明有一個定義可用,並在那裏字包含換句話說,即,「房子」和「房子的計劃」雙方進行了定義,我不是案件肯定怎麼可能? –

回答

1

僅僅拋出觀點:

  • 正則表達式將要求每個字進行掃描,這將花費太長的時間。
  • 複合詞將需要瘋狂處理,除非它在層中處理。

可能的算法:

  • 拆分的文本字符串數組:text[]
  • 存儲在內存中的定義字(隻字):words[]
    • 使用System.Collections.Generic.HashSet,因爲它有一個真正的快速查找
  • 通過每text[]如果是在words[]
  • 在前端有<span class='known'>標記它,使用AJAX當鼠標懸停時

要處理複合詞:

  • 此使用正則表達式。不應該有太多複合詞。如果有,那麼你就可以看到哪些words[]做的複合詞正則表達式搜索之前就已存在。

AJAX鼠標懸停事件:標籤化的邏輯是完全

  • 後,你可能有嵌套span標籤:<span class='known'><span class='known'>house</span> plan</span>,這是罰款。你的jQuery將最外層的span標籤發送給服務器,服務器可以返回所有匹配的單詞。
+0

聽起來不錯,我有點被你的複合詞的意思混淆,你能解釋一點? –

+1

你處理文本[]數組後,只要改革文本,然後做複合詞典型的正則表達式搜索。如果正則表達式複合詞看起來代價高昂,則只能搜索具有匹配的複合詞。例如,如果文檔從未找到與「房子」匹配的內容,則不必將搜索「內部計劃」進行正則表達式化。 – rkw

+0

我想知道是否並行會有助於進一步 –

1

的事物,需要較長的時間來運行,並且不經常變化,不要忘記貧賤批處理作業。晚上將文檔解析爲HTML頁面。運行你的正則表達式並插入JavaScript,或其他。然後保存一次HTML並根據需要多次提供。這是古老的方式,但它仍然堅實。