【问题标题】:SQL like '%term%' except without lettersSQL 类似于 '%term%',但没有字母
【发布时间】:2015-08-15 21:55:35
【问题描述】:

我正在搜索新闻文章表。两个相关的列是ArticleTitleArticleText。当我想在一篇文章中搜索特定术语时,我从

开始

column LIKE '%term%'

但是,这给了我很多文章,其中包含锚链接中的术语,例如<a href="example.com/*term*>,它可能会返回不相关的文章。

然后我切换到

column LIKE '% term %'

这个查询的问题是它没有找到标题或文本以该词开头/结尾的文章。它也与我想要的 term-term's 不匹配。

看来我想要的查询应该能够做这样的事情

'%[^a-z]term[^a-z]%

这应该排除锚链接中的术语,但其他所有内容。我认为这个查询仍然排除了以该术语开头/结尾的字符串。有更好的解决方案吗? SQL-Server 的全文索引是否解决了这个问题?

此外,将ArticleTitleArticleText 存储为无HTML 列是否是个好主意?然后我可以使用'%term%' 而不获取锚链接。不过,这些将是 2 个额外的列,因为最终我将需要原始 HTML 进行格式化。

谢谢。

【问题讨论】:

  • 是的,这是个好主意,因为您需要查询这些字段
  • 使用 % 通配符来搜索文本字段非常慢并且充满了这样的麻烦。创建全文索引并使用CONTAINS() 搜索。

标签: sql sql-server tsql wildcard sql-like


【解决方案1】:

SQL Server 的LIKE 允许您像描述的那样定义类似正则表达式的模式。

更好的选择是使用fulltext search:

WHERE CONTAINS(ArticleTitle, 'term')

正确利用索引(LIKE '%term%' 查询很慢),并在搜索算法中提供其他好处。

此外,您可能会受益于将文章的纯文本版本与 HTML 版本一起存储,并在其上运行搜索查询。

【讨论】:

  • 对于纯文本,如果您从不需要只搜索标题或文本,但总是想同时搜索两者,则剥离 HTML 的标题和文本并将它们连接成一个纯文本值以进行全文搜索。这将提供比 CONTAINS(PlainTitle, 'term') OR CONTAINS(PlainText, 'term') 更好的性能。
【解决方案2】:

SQL 不是为解释 HTML 字符串而设计的。因此,您只能将问题推迟到更困难的问题出现(例如,将您的搜索词作为普通句子的一部分的评论节点)。

您仍然可以将全文用作预过滤器,然后在应用程序层上运行 HTML 分析以进一步过滤您的结果集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多