真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

lucene+jquery+struts2json插件實(shí)現(xiàn)搜索框自動(dòng)補(bǔ)全

看了一堆自動(dòng)補(bǔ)齊的例子,大多都是只有前臺(tái)沒有后臺(tái),有后臺(tái)也是在后臺(tái)寫死的數(shù)據(jù),所以不具有真實(shí)的實(shí)用性,拿來學(xué)習(xí)還是可以的,但也是僅僅限于jquery的學(xué)習(xí)。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比濰城網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式濰城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋濰城地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。

接下來我要寫一個(gè)從后臺(tái)數(shù)據(jù)庫生成lucene索引文件,在struts2Action中查根據(jù)key值查詢索引文件,獲取到部分符合關(guān)鍵字(key值)的數(shù)據(jù),通過json格式返回到前臺(tái)頁面,在使用jquery完成自動(dòng)補(bǔ)齊的完整例子。

首先第一步從數(shù)據(jù)庫中獲取索引文件。

  1. package com.net263.boss.charge.action;  
  2.  
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import org.apache.log4j.Logger;  
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  7. import org.apache.lucene.document.Document;  
  8. import org.apache.lucene.document.Field;  
  9.  
  10. import org.apache.lucene.index.IndexWriter;  
  11.  
  12. import org.quartz.JobExecutionContext;  
  13. import org.quartz.JobExecutionException;  
  14. import org.springframework.scheduling.quartz.QuartzJobBean;  
  15.  
  16. import com.net263.boss.business.service.ICustomerService;  
  17. public class CreateSearchIndex extends QuartzJobBean {  
  18.  
  19.     /* 
  20.      * (non-Javadoc) 
  21.      *  
  22.      * @see 
  23.      * org.springframework.scheduling.quartz.QuartzJobBean#executeInternal(org 
  24.      * .quartz.JobExecutionContext) 
  25.      */ 
  26.     private ICustomerService customerService;  
  27.  
  28.  
  29.     /** 
  30.      * @return the customerService 
  31.      */ 
  32.     public ICustomerService getCustomerService() {  
  33.         return customerService;  
  34.     }  
  35.     /** 
  36.      * @param customerService the customerService to set 
  37.      */ 
  38.     public void setCustomerService(ICustomerService customerService) {  
  39.         this.customerService = customerService;  
  40.     }  
  41.     private static Logger logger = Logger.getLogger(CreateSearchIndex.class);  
  42.     public void executeInternal(JobExecutionContext context)  
  43.             throws JobExecutionException {  
  44.         String path = this.getClass().getClassLoader().getResource("").getPath().replace(" ","\" \"")+"index";  
  45.         logger.info("begin...");  
  46.         //path=path.substring(1).trim(); 
  47.         logger.info("index path is :"+path);  
  48.         List list = new ArrayList();  
  49.         IndexWriter writer;  
  50.         try {  
  51.             list = customerService.queryCustomerName();  
  52.             logger.info("get index successfully.");  
  53.         } catch (Exception e) {  
  54.             e.printStackTrace();  
  55.         }  
  56.         try {  
  57.             writer = new IndexWriter(path,new StandardAnalyzer(),true);  
  58.             for(String tempC : list)  
  59.             {  
  60.                 if(tempC==null || "".equals(tempC))  
  61.                     {  
  62.                     continue;  
  63.                     }  
  64.                 else 
  65.                 {  
  66.                     Document docA = new Document();  
  67.                     Field fieldA = new Field("content",tempC,Field.Store.YES,Field.Index.TOKENIZED);  
  68.                     docA.add(fieldA);  
  69.                     writer.addDocument(docA);  
  70.                 }  
  71.                   
  72.             }  
  73.             //如果對(duì)海量數(shù)據(jù)進(jìn)行創(chuàng)建索引的時(shí)候,需要對(duì)索引進(jìn)行優(yōu)化,以便提高速度 
  74.             writer.optimize();  
  75.             //跟數(shù)據(jù)庫類似,打開一個(gè)連接,使用完后,要關(guān)閉它 
  76.             writer.close();  
  77.             logger.info("end...");  
  78.         } catch (Exception e) {  
  79.             e.printStackTrace();  
  80.             logger.info("error...");  
  81.         }   
  82.     }  
  83.  
  84. }  

以上代碼是通過Quartz來進(jìn)行啟動(dòng)的,每分鐘進(jìn)行一次索引文件的同步。

配置文件如下:

 

  1.      
  2.         
  3.       
  4.        
  5.      
  6.        
  7.      
  8.          
  9.      
  10.  
  11.       
  12.       
  13.        
  14.            
  15.    

好了,創(chuàng)建索引文件就基本完成了啊。

下面,我們來通過Action獲取到所需的自動(dòng)補(bǔ)全信息。

 

  1. import java.util.ArrayList;  
  2. import java.util.Date;  
  3. import java.util.List;  
  4.  
  5. import net.sf.json.JSONArray;  
  6.  
  7. import org.apache.log4j.Logger;  
  8. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  9. import org.apache.lucene.queryParser.QueryParser;  
  10. import org.apache.lucene.search.Hits;  
  11. import org.apache.lucene.search.IndexSearcher;  
  12. import org.apache.lucene.search.Query;  
  13. import org.apache.struts2.json.annotations.JSON;  
  14.  
  15. import com.net263.boss.util.JsonUtils;  
  16. import com.opensymphony.xwork2.ActionSupport;  
  17.  
  18. public class QueryCustomerNameAction extends ActionSupport {  
  19.     String path = this.getClass().getClassLoader().getResource("").getPath().replace(" ","\" \"")+"index";  
  20.     private String customerName;  
  21.     List list =new ArrayList();  
  22.     /** 
  23.      * @return the list 
  24.      */ 
  25.     public List getList() {  
  26.         return list;  
  27.     }  
  28.  
  29.     /** 
  30.      * @param list the list to set 
  31.      */ 
  32.     public void setList(List list) {  
  33.         this.list = list;  
  34.     }  
  35.  
  36.     private static final Logger LOGGER = Logger.getLogger(QueryCustomerNameAction.class);  
  37.  
  38.     public void setKey(String customerName) {  
  39.         this.customerName = customerName;  
  40.     }  
  41.  
  42.     public Query queryParser(String key){  
  43.         //content 為默認(rèn)搜索的Field列名 
  44.         QueryParser queryParser = new QueryParser("content", new StandardAnalyzer());  
  45.         try {  
  46.             Query query =  queryParser.parse(key);  
  47.             return query;  
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.         return null;  
  52.     }  
  53.       
  54.     public String searchName()  
  55.     {  
  56.         Date startTime,endTime;  
  57.         try {  
  58.               
  59.             IndexSearcher search = new IndexSearcher(path);  
  60.             startTime = new Date();  
  61.             //抽象的查詢對(duì)象 
  62.             if(customerName!=null && !("".equals(customerName)))  
  63.             {  
  64.                 Query query = queryParser(customerName);  
  65.             //搜索結(jié)果集Hits 
  66.             Hits hits = search.search(query);  
  67.             for (int i = 0; i < hits.length(); i++) {  
  68.                 int beginIndex=hits.doc(i).toString().indexOf(":");  
  69.                 int endIndex=hits.doc(i).toString().indexOf(">");  
  70.                 list.add(hits.doc(i).toString().substring(beginIndex+1, endIndex));  
  71.                 System.out.println(hits.doc(i).toString().substring(beginIndex+1, endIndex));  
  72.                 if(i>8)  
  73.                 {  
  74.                     break;  
  75.                 }  
  76.             }  
  77.             }  
  78.             endTime = new Date();  
  79.             System.out.println("本次搜索用時(shí):" + (endTime.getTime() - startTime.getTime()) + "毫秒");  
  80.             LOGGER.info("本次搜索用時(shí):" + (endTime.getTime() - startTime.getTime()) + "毫秒");  
  81.             LOGGER.info("list:"+JsonUtils.listToJson(list));  
  82.         } catch (Exception e) {  
  83.             LOGGER.info("沒有搜索到對(duì)應(yīng)分詞");  
  84.             //e.printStackTrace(); 
  85.         }  
  86.         return "success";  
  87.     }  
  88.  

這里面用到了struts2的json插件,這個(gè)插件很好用,它會(huì)把Action中所要返回的數(shù)據(jù)自動(dòng)封裝成json格式的,本例子中需要返回list,就會(huì)講list中存放的數(shù)據(jù)json化。

需要特別提示的是:

 

  1.    
  2.        
  3.          
  4.          
  5.         list 
  6.            
  7.      
  8.   

需要繼承json-default

這樣,我們的后臺(tái)基本就寫完了?,F(xiàn)在總結(jié)一下:后臺(tái)主要完成的功能就是數(shù)據(jù)庫到索引文件的同步和通過key查詢索引文件返回json結(jié)果集的這么一個(gè)過程。

最后,我們來寫前臺(tái)jquery,這個(gè)大部分例子有用了,我就不再詳細(xì)敘述了,只把代碼貼出來。還要說明一點(diǎn),大多數(shù)例子所捕獲的鍵盤信息嚴(yán)重不足,我多加捕獲了一些,包括輸入漢字時(shí)輸入法前的數(shù)字1-5,當(dāng)然可以捕獲更多。

 

  1. var highlightindex =-1;  
  2. $(document).ready(function() {  
  3.     var wordInput=$("#customerName");  
  4.     var wordInputOffset=wordInput.offset();  
  5.     var auto=$("#autoComplete").hide().css("border","3px white solid").css("background-color" ,"white")  
  6.     .css("position","absolute")  
  7.     .css("top",wordInputOffset.top+wordInput.height()+12+"px")  
  8.     .css("left",wordInputOffset.left+"px").width(wordInput.width()+6);  
  9.     wordInput.keyup(function(event){  
  10.         var myEvent =event || window.event;  
  11.         var keyCode = myEvent.keyCode;  
  12.         var wordText =$("#customerName").val();  
  13.         var actionurl="search.action";  
  14.         if(keyCode>=65 && keyCode<=90 ||keyCode==8 || keyCode==46 || keyCode==32 || keyCode==49 || keyCode==50 || keyCode==51 || keyCode==52 || keyCode==53)  
  15.         {  
  16.         if(wordText != ""){  
  17.                 $.ajax({    
  18.                     url : actionurl,    
  19.                     data : {key : wordText},    
  20.                     type : 'POST',    
  21.                     dataType : 'json',    
  22.                     success : function(data) {  
  23.                         $(auto).empty();  
  24.                                 $.each(data,function(index,term){  
  25.                                     var newDwNode = $("
    ").attr("id",index);  
  26.                                     newDwNode.html(term).appendTo(auto);  
  27.                                     //鼠標(biāo)移入 
  28.                                     newDwNode.mouseover(function(){  
  29.                                         if (highlightindex != -1) {  
  30.                                             var autoNodes = $(auto).children("div");  
  31.                                             autoNodes.eq(highlightindex).css("background-color" ,"white").css("font-weight","normal");  
  32.                                         }  
  33.                                         highlightindex = $(this).attr("id");  
  34.                                         $(this).css("background-color","#CCCCFF").css("font-weight", "800");  
  35.                                     });  
  36.                                     //鼠標(biāo)移出 
  37.                                     newDwNode.mouseout(function(){  
  38.                                         $(this).css("background-color" ,"white").css("font-weight","normal");  
  39.                                     });  
  40.                                     //鼠標(biāo)單擊 
  41.                                     newDwNode.click(function(){  
  42.                                         var dataText = $(this).text();  
  43.                                         wordInput.val(dataText);  
  44.                                         $(auto).hide();  
  45.                                     });  
  46.                                 });  
  47.                                 if(data.length>0)  
  48.                                 {  
  49.                                     $(auto).show();  
  50.                                 }  
  51.                                 else 
  52.                                 {  
  53.                                     $(auto).hide();  
  54.                                     parseInt(highlightindex) =-1;  
  55.                                 }  
  56.                     }    
  57.                 });   
  58.             }  
  59.         else 
  60.         {  
  61.             $(auto).hide();  
  62.             parseInt(highlightindex) =-1;  
  63.         }  
  64.         }  
  65.         else if(keyCode==38 || keyCode==40)  
  66.         {  
  67.             if(keyCode==38)//向上 
  68.             {  
  69.                 var autoNodes = $(auto).children("div");  
  70.                 if (highlightindex!= -1) {  
  71.                             autoNodes.eq(highlightindex).css("background-color" ,"white").css("font-weight","normal");  
  72.                             highlightindex=highlightindex-1;  
  73.                         } else {  
  74.                             parseInt(highlightindex)=autoNodes.length-1;  
  75.                         }  
  76.                 if (highlightindex == -1) {  
  77.                     highlightindex=autoNodes.length-1;  
  78.                 }  
  79.                 var dataText = autoNodes.eq(highlightindex).css("background-color","#CCCCFF").css("font-weight", "800").text();  
  80.                 wordInput.val(dataText);  
  81.             }  
  82.             if(keyCode==40)//向下 
  83.             {  
  84.                 var autoNodes = $(auto).children("div");  
  85.                 if (parseInt(highlightindex) != -1) {  
  86.                             autoNodes.eq(highlightindex).css("background-color" ,"white").css("font-weight","normal");  
  87.                         }   
  88.                 highlightindex=parseInt(highlightindex)+1;  
  89.                 if (highlightindex == autoNodes.length) {  
  90.                     highlightindex=0;  
  91.                 }  
  92.                 var dataText = autoNodes.eq(highlightindex).css("background-color","#CCCCFF").css("font-weight", "800").text();  
  93.                 wordInput.val(dataText);  
  94.             }  
  95.               
  96.         }else if(keyCode==13)//回車 
  97.         {  
  98.             $(auto).hide();   
  99.             highlightindex =-1;  
  100.         }  
  101.     })  
  102. }) 

最后顯示效果如下:

 

lucene+jquery+struts2json插件實(shí)現(xiàn)搜索框自動(dòng)補(bǔ)全

 


當(dāng)前名稱:lucene+jquery+struts2json插件實(shí)現(xiàn)搜索框自動(dòng)補(bǔ)全
網(wǎng)站網(wǎng)址:http://weahome.cn/article/jsjopd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部