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

本文深入探讨了搜索的实现方式,从快速搜索到普通搜索再到高级搜索,详细介绍了每种搜索的特点、实现方法及注意事项,旨在帮助开发者全面理解搜索技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 
     一、快速搜索
 
     大家都知道,当我们进行快速搜索时,通常是对已定义好的几个对象的属性进行搜索。因为各种条件都已事先定义好,所以构建搜索的语句就变的相对简单,我们用一行普通的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.      ... 
 
     四、特定搜索
 
     特定搜索是基于某个特定业务而实现的搜索,由于界面上没有任何可选的条件,其实现由后台代码一呵而成。从特定搜索所搜索的范围与条件来说,特定搜索是普通搜索的一种实现与扩展。读者直接参照普通搜索的实现方式完成特定搜索即可。
 
     以上所讲的搜索,都是经常见且经常用的搜索,所以本文没有对其做过多的介绍。除了上面所讲的四类搜索之外,还有二次搜索、全文搜索和导航搜索等搜索方式。由于这些搜索不常见性,我将会在接下来的文章中对这几种搜索做详细介绍,希望能够让读者能够全面了解搜索。
     
 
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值