首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

模糊搜索的一些圈套

2012-10-28 
模糊搜索的一些陷阱如果你手头的某个项目或产品有模糊搜索的功能,建议你做个测试:在搜索框中输入:“_”(下划

模糊搜索的一些陷阱
如果你手头的某个项目或产品有模糊搜索的功能,建议你做个测试:
在搜索框中输入:“_”(下划线)或者“%”(百分号),然后进行搜索,看看会得到什么结果。
如果你的搜索结果与预期一致,即只搜到含“_”或“%”的结果,那么恭喜你,你没有掉到这个陷阱中去,尽管你自己可能根本没意识到为什么。
如果你的搜索结果出现了很多根本不含任何“_”或“%”的结果,那说明你跟我一样,根本就没考虑过这个问题,这也正是本文要解决的问题。
其实这个问题说也简单,因为我们绝大多数搜索都是基于SQL的,其中的模糊搜索应该大多数人都知道,就是:
LIKE %XX%,其中%代表任意长度的字符串,跟我们常用的通配符“*”作用类似。除了"%"比较常用外,还有一个可能很多人不知道的通配符:“_”,
其作用跟常见的通配符“?”作用类似。基于以上原因,如果你不做任何处理,直接搜索包含着两个特殊字符的关键词是不可能得到正确结果的。
例如,如果直接输入%或_搜索,得到的是所有结果集合。
难道就没有办法搜索这种特殊字符吗?办法当然是有的,那就是用‘escape’这个鲜为人知的关键词,
例如可以用下面的语句:

   Select * from demo_table where keyword like '^%' escape '^' ;



这里'^'本来是个普通字符,但经过escape之后,它就变成了一个转义符,在它之后的%就被它转义为一个普通字符了。这样就可以进行对特殊字符的查询了。
也许有人会说,我根本没有考虑过这个问题,但我的系统能够正常查询,这是为什么呢?
这是因为你依赖的后台系统已经替你考虑了。比如hibernate的criteria已经对此作了特殊封装,有兴趣的可以看看它的LikeExpression类是如何处理的。
而如果你用的不是hibernate,则需要自己亲自处理这个问题了。Restrictions.like("code", code, MatchMode.ANYWHERE)Restrictions.like("code", code, MatchMode.ANYWHERE)
escape只是指定一个字符当转义符,默认的是\Restrictions.like("code", code, MatchMode.ANYWHERE)
escape只是指定一个字符当转义符,默认的是\

哦,仔细看了LikeExpression,原来功能比Restrictions.like多得多啊。
4 楼 cjmcn-sh 2008-07-28   又学到了一点.知识靠积累! 5 楼 kaneg 2008-08-08   我也是看了hibernate的代码才知道是这么做的,我用的是oracle 9i,不过因为'%'是标准的sql字符,所以其他数据库应该也有这样的问题 6 楼 heaven.robin 2008-09-24   3.2的版本已经没有用likeExpression了,都是用的SimpleExpression,但可以这样用
criteria.add(Restrictions.sqlRestriction("{alias}.code like '%\\%%' escape '\\'"))就可以了。

热点排行