搜索那些事儿(四) - 单业务搜索是怎么实现的

搜索那些事儿(四) --- 单业务搜索是如何实现的
      在《你了解搜索的种类吗》一文中,我们着重介绍了不同种类的搜索,以及他们的展现方式。在本文中,我们将逐层深入,讨论几种不同类型的搜索的实现方式。此外,本文在讨论搜索的实现时,借用《从面向对象的角度谈搜索》中的词汇,如果读者不熟悉,请点击此处进行查看。

     一、快速搜索

     大家都知道,当我们进行快速搜索时,通常是对已定义好的几个对象的属性进行搜索。因为各种条件都已事先定义好,所以构建搜索的语句就变的相对简单,我们用一行普通的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){
     ...
     ...
}

     四、特定搜索

     特定搜索是基于某个特定业务而实现的搜索,由于界面上没有任何可选的条件,其实现由后台代码一呵而成。从特定搜索所搜索的范围与条件来说,特定搜索是普通搜索的一种实现与扩展。读者直接参照普通搜索的实现方式完成特定搜索即可。

     以上所讲的搜索,都是经常见且经常用的搜索,所以本文没有对其做过多的介绍。除了上面所讲的四类搜索之外,还有二次搜索、全文搜索和导航搜索等搜索方式。由于这些搜索不常见性,我将会在接下来的文章中对这几种搜索做详细介绍,希望能够让读者能够全面了解搜索。
     

     
1楼lfmilaoshi昨天 23:31
值得好好的思考呀