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

 
     一、快速搜索
 
     大家都知道,当我们进行快速搜索时,通常是对已定义好的几个对象的属性进行搜索。因为各种条件都已事先定义好,所以构建搜索的语句就变的相对简单,我们用一行普通的SQL语句就可搞定:
     
  1. Select t from table t where t.propertyA like '%searchKey%' or t.propertyB like '%searchKey%' or ... 
 
     在这种业务极其简单,搜索范围特别局限的情况,我们根本不必考虑可扩展性,只要搜索效率够高、搜索速度够快就好。
 
     二、普通搜索
 
     尽管在界面展示上,普通搜索比快速搜索展示的内容多很多,但是在SQL的眼里,普通搜索和快速搜索没有什么区别,它只不过是搜索的  OR 条件换成了 AND 
      
  1. Select t from table t where t.propertyA like '%searchKey1%' and t.propertyB like '%searchKey2%' and ... 
 
     尽管如此,它还是增大了我们实现的复杂度。因为我们要根据表单上是否有值,来判定是否对这些属性进行搜索。通常有这么两种实现方式,来组建我们进行搜索的whereCondition
 
     方法一:
     
  1. public static List commonSearch1(String key1,String key2,String key3){ 
  2.      StringBuffer sb = new StringBuffer(); 
  3.      sb.append("select t from table t where 1 or 1"); 
  4.      if(!"".equal(key1)){ 
  5.           sb.append(" and propertyA like '%").append(key1).append("%'");; 
  6.      } 
  7.      if(!"".equal(key2)){ 
  8.           sb.append(" and propertyB like '%").append(key2).append("%'");; 
  9.      } 
  10.      if(!"".equal(key3)){ 
  11.           sb.append(" and propertyC like '%").append(key3).append("%'");; 
  12.      } 
  13.      ... 
 
     方法二:

 

  1. public static List commonSearch2(Map map){ 
  2.      StringBuffer sb = new StringBuffer(); 
  3.      sb.append("select t from table t where 1 or 1"); 
  4.      if(map.containsKey(key1) && !"".equal(map.get(key1))){ 
  5.           sb.append(" and propertyA like '%").append(key1).append("%'");; 
  6.      } 
  7.      if(map.containsKey(key2) && !"".equal(map.get(key2))){ 
  8.           sb.append(" and propertyB like '%").append(key2).append("%'");; 
  9.      } 
  10.      if(map.containsKey(key3) && !"".equal(map.get(key3))){ 
  11.           sb.append(" and propertyC like '%").append(key3).append("%'");; 
  12.      } 
  13.      ... 
  14. }    
 
     上述这两种方式,方法一对于参数较少的情况下易用性更好些,而方法二则针对于参数较多的情况下。读者可以根据自己的情况,选择适合自己的方式。
 
     另外,不知道读者有没有注意到,快速搜索其实是普通搜索的特例。如果写了一个普通搜索,那么快速搜索完全可以重用普通搜索,来构建快速搜索。
 
     三、高级搜索
 
     对于那些简单的高级搜索,比如说所有动态添加的条件都是并关系或者或关系,那么我们就可以使用上面描述的方法二来实现高级搜索。但是客户的需求往往并不止步于此,他们希望能够按照自己的喜好定义这些搜索条件是取交集还是并集。通过对比发现,每次的搜索的范围由原来的key与value,又增加了关系操作符operateType。
 
     通常情况下,高级搜索是这么实现的。  
 
  1. public class AdvancedSearchTemplate{ 
  2.      private String searchProperty;     //搜索的属性          
  3.      private String searchValue;          //搜索的值。如果为多值,则采用“,”号分开 
  4.      private String searchType;          //搜索类型 = 、<>、like等 
  5.      private String operateType;          //连接类型 and、or 
  6.      private boolean isMultiple;          //是否为多值,true表示为多值 
  7.      ... 
  8.  
  9. public static List advancedSearch(AdvancedSearchTemplate[] advancedSearchTemplates){ 
  10.      ... 
  11.      ... 
 
     四、特定搜索
 
     特定搜索是基于某个特定业务而实现的搜索,由于界面上没有任何可选的条件,其实现由后台代码一呵而成。从特定搜索所搜索的范围与条件来说,特定搜索是普通搜索的一种实现与扩展。读者直接参照普通搜索的实现方式完成特定搜索即可。
 
     以上所讲的搜索,都是经常见且经常用的搜索,所以本文没有对其做过多的介绍。除了上面所讲的四类搜索之外,还有二次搜索、全文搜索和导航搜索等搜索方式。由于这些搜索不常见性,我将会在接下来的文章中对这几种搜索做详细介绍,希望能够让读者能够全面了解搜索。