我正在搜索一篇新闻报道。 2个相关专栏是ArticleTitle
和ArticleText
。当我想搜索特定术语的文章时,我开始使用
column LIKE '%term%'
。
然而,这给了我很多关于锚链接内的术语的文章,例如<a href="example.com/*term*>
可能会返回一篇不相关的文章。
所以我转而去了
column LIKE '% term %'
。
此查询的问题是它没有找到文章的标题或文本以该术语开头/结尾。它也不符合像term-
或term's
这样的东西,我确实想要它。
似乎我想要的查询应该能够做这样的事情
'%[^a-z]term[^a-z]%
这应该排除锚链接中的术语,但不包括其他所有内容。我认为这个查询仍然排除了以该术语开头/结尾的字符串。有更好的解决方案吗? SQL-Server的FULL TEXT INDEXING是否解决了这个问题?
另外,将ArticleTitle
和ArticleText
存储为无HTML列是一个好主意吗?然后我可以使用'%term%'
而无需获得锚链接。这些将是2个额外的列,因为最终我将需要原始的HTML用于格式化目的。
谢谢。
SQL Server的LIKE
允许您像您描述的那样定义类似Regex的模式。
更好的选择是使用fulltext search:
WHERE CONTAINS(ArticleTitle, 'term')
正确利用索引(LIKE '%term%'
查询很慢),并在搜索算法中提供其他好处。
此外,您可能会受益于将文章的纯文本版本与HTML版本一起存储,并在其上运行搜索查询。
SQL不是为解释HTML字符串而设计的。因此,您只能推迟问题,直到更难的问题到来(例如,包含您的搜索词作为普通句子的一部分的注释节点)。
您仍然可以使用FULL TEXT作为预过滤器,然后在应用程序层上运行HTML分析以进一步过滤结果集。