2010-02-11 39 views
3

我們有一個包含HTML標記的網站上格式化領域,但我們需要查詢只是要在屏幕上呈現文本,不喜歡的東西CSS標籤,標籤名,屬性名等如何查詢數據庫字段但忽略HTML標記?

有一種忽略SQL查詢或存儲過程中標記權限的方法?如果有辦法做到這一點,我們以後會有性能問題嗎?

我的猜測是有一些方法可以使用尖括號來分析可搜索文本的字段。

回答

3
+0

我在想像這樣的功能會更困難,但通過它閱讀使我意識到,假設我有良好的HTML這應該始終工作。 我們現在正在測試這個。謝謝! – JoshBaltzell 2010-02-11 18:58:25

+9

每次嘗試使用正則表達式解析HTML時,上帝會殺死一隻小貓。 – Aaronaught 2010-02-11 19:26:11

+0

幸運的是,沒有涉及正則表達式:) – 2010-02-11 19:55:19

4

處理這樣不應該在數據庫中進行。我會建議創建一個單獨的字段,只包含文本內容。

回覆@Nissan粉絲評論:從HTML中提取文本不是數據庫的工作IMO。這對於它來說太複雜了,它有太多的變數。我並不熟悉閱讀存儲過程,但是如果我正確地閱讀代碼,它將在源代碼中出現(無效但仍然經常發生)未編碼的<問題。它很可能會因爲無效的HTML而中斷。

或想象有一天,顧客來了,並希望img元素'​​屬性索引也。或者title s。開始建立一個「開始位置,結束位置」算法。你會去瘋狂。我想說,如果需要在日常的基礎上處理超出控制範圍的不同來源的HTML,可以將它留在數據庫上方的一層,以便處理這些東西。基於DOM的方法 - 可能使用BeautifulSoup來處理無效的HTML - 解析所有的nodeValue將是最可靠的。

也許這是矯枉過正,並且存儲過程在OP的情況下可以正常工作 - 從他的評論中看起來像是這樣,而且這完全沒問題。我只是說,如果您無法控制傳入的HTML,請不要使用數據庫提供的有限手段去除HTML。

+0

複製數據,因爲您必須查詢它的一個子集似乎不規則。這就像將某個日期分解到每個組件中一樣,因爲有人只想查詢該月份。如果這不是一個非常大規模的數據庫,它不應該成爲一個問題。 – 2010-02-11 18:37:31

+0

這是一個好主意,每當你查詢的時候剝去HTML一定會很慢。 – HLGEM 2010-02-11 18:41:04

+0

這也是用於存儲相同信息的空間的兩倍。還有很多其他的事情需要考慮...也許這個搜索是每5000次使用HTML數據一次的功能?想象一下,一個應用程序顯示帶有標籤的數據列表,但允許在每次使用時很少使用的文本搜索。沒有足夠的上下文來證明這一點。另外,我的分歧與他關於一個單獨領域的陳述有關,而更多的是與查詢這樣的數據完全是數據庫的用途有關。 – 2010-02-11 18:46:47

0

如果您通過刪除試圖索引這些列和訪問它的一個html:

WHERE dbo.anyRemoveHtml(yourColumn)='your search text' 

該索引將不會被使用,您將進行表掃描。當應用程序只有很少的數據時,這可能不會成爲問題,但是隨着更多數據添加到表中,會導致SELECT速度越來越慢。

注:dbo.anyRemoveHtml只是表示您選擇要刪除HTML功能的由名字,並沒有真正存在

3

我佩卡的同意;這不是你的數據庫應該處理的東西。

缺點在DB這樣解析:

  1. 性能問題。使用UDF可能會降低性能並導致表掃描。即使你避免了表掃描,你仍然要求數據庫做一堆事情(字符串操作),它不是爲了做。

  2. 很難找對。正確解析HTML是一項艱鉅的工作。確實,你可以通過UDF獲得95%的方式,但在應用程序層處理這個問題可能會使你獲得100%的回報。

  3. 難以測試。我更願意爲在C#中針對字符串文字執行的HTML剝離代碼編寫單元測試,而不是必須往返數據庫。

如果必須爲此在DB ...

如果在DB這樣做是必須的,考慮這個方法:

  1. 添加第二個字段添加到數據庫以保存內容的純文本版本。

  2. 添加一個觸發器,以便每次更改HTML值時都重新生成文本版本。

  3. 將您的查詢寫入純文本字段。

你會獲得更好的性能,因爲你只是做了分析,在寫的時候,而不是在每一個搜索,你的數據庫將更好地利用你的純文本字段定義任何索引。