搜索那些事儿(四) - 单业务搜索是怎么实现的
搜索那些事儿(四) --- 单业务搜索是如何实现的
在《你了解搜索的种类吗》一文中,我们着重介绍了不同种类的搜索,以及他们的展现方式。在本文中,我们将逐层深入,讨论几种不同类型的搜索的实现方式。此外,本文在讨论搜索的实现时,借用《从面向对象的角度谈搜索》中的词汇,如果读者不熟悉,请点击此处进行查看。
一、快速搜索
大家都知道,当我们进行快速搜索时,通常是对已定义好的几个对象的属性进行搜索。因为各种条件都已事先定义好,所以构建搜索的语句就变的相对简单,我们用一行普通的SQL语句就可搞定:
Select t from table t where t.propertyA like '%searchKey%' or t.propertyB like '%searchKey%' or ...
在这种业务极其简单,搜索范围特别局限的情况,我们根本不必考虑可扩展性,只要搜索效率够高、搜索速度够快就好。
二、普通搜索
尽管在界面展示上,普通搜索比快速搜索展示的内容多很多,但是在SQL的眼里,普通搜索和快速搜索没有什么区别,它只不过是搜索的 OR 条件换成了 AND 。
Select t from table t where t.propertyA like '%searchKey1%' and t.propertyB like '%searchKey2%' and ...
尽管如此,它还是增大了我们实现的复杂度。因为我们要根据表单上是否有值,来判定是否对这些属性进行搜索。通常有这么两种实现方式,来组建我们进行搜索的whereCondition。
方法一:
public static List commonSearch1(String key1,String key2,String key3){
StringBuffer sb = new StringBuffer();
sb.append("select t from table t where 1 or 1");
if(!"".equal(key1)){
sb.append(" and propertyA like '%").append(key1).append("%'");;
}
if(!"".equal(key2)){
sb.append(" and propertyB like '%").append(key2).append("%'");;
}
if(!"".equal(key3)){
sb.append(" and propertyC like '%").append(key3).append("%'");;
}
...
}
方法二:
public static List commonSearch2(Map map){
StringBuffer sb = new StringBuffer();
sb.append("select t from table t where 1 or 1");
if(map.containsKey(key1) && !"".equal(map.get(key1))){
sb.append(" and propertyA like '%").append(key1).append("%'");;
}
if(map.containsKey(key2) && !"".equal(map.get(key2))){
sb.append(" and propertyB like '%").append(key2).append("%'");;
}
if(map.containsKey(key3) && !"".equal(map.get(key3))){
sb.append(" and propertyC like '%").append(key3).append("%'");;
}
...
}
上述这两种方式,方法一对于参数较少的情况下易用性更好些,而方法二则针对于参数较多的情况下。读者可以根据自己的情况,选择适合自己的方式。
另外,不知道读者有没有注意到,快速搜索其实是普通搜索的特例。如果写了一个普通搜索,那么快速搜索完全可以重用普通搜索,来构建快速搜索。
三、高级搜索
对于那些简单的高级搜索,比如说所有动态添加的条件都是并关系或者或关系,那么我们就可以使用上面描述的方法二来实现高级搜索。但是客户的需求往往并不止步于此,他们希望能够按照自己的喜好定义这些搜索条件是取交集还是并集。通过对比发现,每次的搜索的范围由原来的key与value,又增加了关系操作符operateType。
通常情况下,高级搜索是这么实现的。
public class AdvancedSearchTemplate{
private String searchProperty; //搜索的属性
private String searchValue; //搜索的值。如果为多值,则采用“,”号分开
private String searchType; //搜索类型 = 、<>、like等
private String operateType; //连接类型 and、or
private boolean isMultiple; //是否为多值,true表示为多值
...
}
public static List advancedSearch(AdvancedSearchTemplate[] advancedSearchTemplates){
...
...
}
private String searchProperty; //搜索的属性
private String searchValue; //搜索的值。如果为多值,则采用“,”号分开
private String searchType; //搜索类型 = 、<>、like等
private String operateType; //连接类型 and、or
private boolean isMultiple; //是否为多值,true表示为多值
...
}
public static List advancedSearch(AdvancedSearchTemplate[] advancedSearchTemplates){
...
...
}
四、特定搜索
特定搜索是基于某个特定业务而实现的搜索,由于界面上没有任何可选的条件,其实现由后台代码一呵而成。从特定搜索所搜索的范围与条件来说,特定搜索是普通搜索的一种实现与扩展。读者直接参照普通搜索的实现方式完成特定搜索即可。
以上所讲的搜索,都是经常见且经常用的搜索,所以本文没有对其做过多的介绍。除了上面所讲的四类搜索之外,还有二次搜索、全文搜索和导航搜索等搜索方式。由于这些搜索不常见性,我将会在接下来的文章中对这几种搜索做详细介绍,希望能够让读者能够全面了解搜索。
- 1楼lfmilaoshi昨天 23:31
- 值得好好的思考呀