2010-02-11 38 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. 将您的查询写入纯文本字段。

你会获得更好的性能,因为你只是做了分析,在写的时候,而不是在每一个搜索,你的数据库将更好地利用你的纯文本字段定义任何索引。