是啥导致 LIKE 语句忽略 html 标记、逗号后的单词或以句点结尾?
Posted
技术标签:
【中文标题】是啥导致 LIKE 语句忽略 html 标记、逗号后的单词或以句点结尾?【英文标题】:What is causing the LIKE statement to disregard html-tags, words after commas, or end in periods?是什么导致 LIKE 语句忽略 html 标记、逗号后的单词或以句点结尾? 【发布时间】:2008-11-07 10:40:45 【问题描述】:我正在开发一个搜索模块,该模块在包含 html 代码的文本列中进行搜索。查询的构造如下:WHERE htmlcolumn LIKE '% searchterm %';
默认模块在搜索项的两端使用空格进行搜索,在搜索项的开头和/或结尾使用通配符,这些空格被删除(*searchterm -> LIKE '%searchterm %'; 我还添加了排除包含某些单词的结果的可能性(-searchterm -> NOT LIKE '% searchterm %')。到目前为止一切顺利。
问题是找不到以 html-tag 开头的单词(<br/>
searchterm 在 LIKE '% searchterm.. 上搜索时找不到,还有逗号后面或以句点结尾的单词ETC。)。
我想做的是搜索前面或后面没有字符 A-Z 和 a-z 的单词。其他所有字符都可以。
任何想法我应该如何实现这一目标?谢谢!
【问题讨论】:
【参考方案1】:查看 mysql 的全文搜索,它可能能够使用非字母字符作为分隔符。它也将比 %term% 搜索快得多,因为这需要全表扫描。
【讨论】:
如果内置的全文搜索不能完全满足您的需求,那么您自己编写一个也不难,然后您可以随意定制它。【参考方案2】:您可以使用正则表达式:http://dev.mysql.com/doc/refman/5.0/en/regexp.html
【讨论】:
你知道,当一个正则表达式是你问题的解决方案时,你会遇到 2 个问题而不是 1 个;) 但我找到了解决这两个问题的方法: WHERE column REGEXP '[^A-Za-z]key[^A-Za-z] 效果很好!谢谢【参考方案3】:一般来说,最好使用全文搜索工具,但如果你真的想要一个小 SQL,这里是:
SELECT * FROM `t` WHERE `htmlcolumn` REGEXP '[[:<:]]term[[:>:]]'
它返回所有包含单词“term”的记录,无论它是否被空格、标点符号、特殊字符等包围
【讨论】:
【参考方案4】:我不认为单独的 SQL 的“LIKE”运算符是适合您尝试做的工作的工具。考虑使用 Lucene 或类似的东西。我能够在几天内将 Lucene.NET 集成到我的应用程序中。你会花更多的时间试图挽救你目前的做法。
如果您别无选择,只能使用当前方法,请考虑将文本存储在数据库中的两列中。第一列是纯文本,带有标点符号等。第二列是经过预处理的文本,只有单词,没有标点符号,标准化以便您的“LIKE”方法更容易。
【讨论】:
以上是关于是啥导致 LIKE 语句忽略 html 标记、逗号后的单词或以句点结尾?的主要内容,如果未能解决你的问题,请参考以下文章