lucene的创建

来源:互联网 发布:大数据公司有哪些 编辑:程序博客网 时间:2024/05/20 06:56

创建Lucene首先需要的是lucene-core-3.0.3.jar,然后创建一个Servlet调用lucene

 

package com.geostar.util.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.SimpleFSDirectory;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.wltea.analyzer.lucene.IKAnalyzer;
import org.wltea.analyzer.lucene.IKQueryParser;
import org.wltea.analyzer.lucene.IKSimilarity;

import com.geostar.model.busds.BUSDataSource;
import com.geostar.query.Constants;
import com.geostar.query.util.XMLUtil;

public class BUSGoogleServlet extends HttpServlet {
 private static final  long serialVersionUID=1L;
 private Logger logger=Logger.getLogger(BUSGoogleServlet.class);
 private  BUSDataSource  busDs;
 //String fieldName = "STANDARDNA";
 File file = new File(Constants.BUS_LUCENE_INDEX_FILE_PATH);
 //String tblname = "t0553l8100s0010k00031040";
 int  QUERYNUM = 10;
 @Override
    public void init(ServletConfig config){
    try{
     ApplicationContext  cn=WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext());
     busDs=(BUSDataSource)cn.getBean("busDs");
     if(logger.isDebugEnabled()){
     logger.info("get injected pojo datasource using  spring ....");
     };
    }catch(Exception exception){
     exception.printStackTrace(); 
     logger.error(exception.getMessage());
    };
      
     };
     @Override
  protected void service(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
   //double dt1 = new Date().getTime();
   // TODO Auto-generated method stub
   response.setContentType("text/xml;charset=utf-8");
   request.setCharacterEncoding("utf-8");
   PrintWriter out = response.getWriter();
   String keyword =request.getParameter("key"); //new String(request.getParameter("key").getBytes("iso8859-1"),"UTF-8");
      if(logger.isDebugEnabled()){
    logger.info("enter  google  servlet service method and  get  params named key :"+keyword);
     };
     if(keyword==null||keyword.length()==0){
      String err=XMLUtil.generateException("请输入key的参数与参数值!");
      out.print(err);
      return;
     };
   Analyzer analyzer = new IKAnalyzer();
   Directory directory = null;
   IndexWriter iwriter = null;
   IndexSearcher isearcher = null;

   try {
    if (!file.exists()) {
     try {
      Class.forName(busDs.getDriverClassName());
      if(logger.isDebugEnabled()){
        logger.info("load jdbc driver class :"+busDs.getDriverClassName());
        };
     } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      //e.printStackTrace();
      logger.error(e.getMessage());
     }

     Connection conn = DriverManager.getConnection(
       busDs.getUrl(),
       busDs.getUserName(),
       busDs.getPassWord());

     //ResultSet rs = conn.createStatement().executeQuery("select * from POI_POINT");
     ResultSet rs = conn.createStatement().executeQuery(
       "select * from " + busDs.getTableName());
     // 建立内存索引对象
     directory = new SimpleFSDirectory(file);
     iwriter = new IndexWriter(directory, analyzer, true,
       IndexWriter.MaxFieldLength.LIMITED);
     //System.out.println("IndexWriter----------"+(new Date().getTime() - dt1) / 1000);
     while (rs.next()) {
      Document doc = new Document();
      doc.add(new Field(busDs.getFieldName(), rs.getString(busDs.getFieldName()),
        Field.Store.YES, Field.Index.ANALYZED));
      iwriter.addDocument(doc);
      logger.info("index field:"+busDs.getFieldName()+" and its value:"+rs.getString(busDs.getFieldName()));
     }
     //System.out.println("iwriter.close-------------"+(new Date().getTime() - dt1) / 1000);
     iwriter.close();
     rs.close();
     conn.close();
     logger.info("index successfully.... ");
    } else {
     //System.out.println("SimpleFSDirectory1-------------"+(new Date().getTime() - dt1) / 1000);
     directory = new SimpleFSDirectory(file);
     logger.info("index from  local file and its path is :"+file.getPath());
     //System.out.println("SimpleFSDirectory2-------------"+(new Date().getTime() - dt1) / 1000);
    }
    
    //System.out.println((new Date().getTime()-dt1)/1000);
    isearcher = new IndexSearcher(directory);
    isearcher.setSimilarity(new IKSimilarity());
    Query query = IKQueryParser.parse(busDs.getFieldName(), keyword);
    //System.out.println(query.toString());
    TopDocs topDocs = isearcher.search(query, QUERYNUM);
    //System.out.println("命中:" + topDocs.totalHits);
    StringBuilder xml = new StringBuilder();
    xml.append("<?xml version=/"1.0/" encoding=/"utf-8/"?>");
    xml.append("<results>");
    // 输出结果
    ScoreDoc[] scoreDocs = topDocs.scoreDocs;
    for (int i = 0; i < (topDocs.totalHits > QUERYNUM ? QUERYNUM : topDocs.totalHits); i++) {
     Document targetDoc = isearcher.doc(scoreDocs[i].doc);
     String fielddata = targetDoc.getFields(busDs.getFieldName())[0].stringValue();
     xml.append("<result key=/"" + fielddata
       + "/"></result>");
     //System.out.println("内容:" + fielddata);
    }
    xml.append("</results>");
    out.print(xml);
    logger.info("response xml: "+xml.toString());
    //System.out.println(xml.toString());
    //System.out.println((new Date().getTime() - dt1) / 1000);
   } catch (CorruptIndexException e) {
    //e.printStackTrace();
    logger.info(e.getMessage());
   } catch (LockObtainFailedException e) {
    //e.printStackTrace();
    logger.info(e.getMessage());
   } catch (IOException e) {
    //e.printStackTrace();
    logger.info(e.getMessage());
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    //e.printStackTrace();
    logger.info(e.getMessage());
   } finally {
    if (isearcher != null) {
     try {
      isearcher.close();
      logger.info("index searcher  closed ...");
     } catch (IOException e) {
      //e.printStackTrace();
      logger.info(e.getMessage());
     }
    }
    if (directory != null) {
     try {
      directory.close();
      logger.info("index directory  closed ...");
     } catch (IOException e) {
      //e.printStackTrace();
      logger.info(e.getMessage());
     }
    }
   }
   //System.out.println((new Date().getTime()-dt1)/1000);

   out.flush();
   out.close();
     }
}

 

前台可以通过以下方法调用

if(!window.AutoBusComplete) window.AutoBusComplete = {};

AutoBusComplete.buscompleteline = 0;
      
AutoBusComplete.busdel = function(){
 try{
     if($("#busDiv")){
         $("#busDiv").remove();
         buscompleteline = 0;
     }
    }catch(e){
     return;
    }
}
  
$(document).ready(function(){
    //文本框失去焦点时层消失
    $(document.body).click(function(){
        AutoBusComplete.busdel();
    });
});
 

//用于调用Lucene的监控方法      
AutoBusComplete.busStartSuggetsres =  function(){
 try{
        AutoBusComplete.busdel();
       var top = $("#startStation").offset().top;
       var left = $("#startStation").offset().left;
       var newDiv = $("<div/>").width($("#startStation").width() + 6)
           .css("position", "absolute")
           .css("backgroundColor", "white")
           .css("left", left)
           .css("top", top + $("#startStation").height() + 6)
           .css("border", "1px solid #CCCCCC")
           .css("z-index", "1000")
           .attr("id", "busDiv");
         
       var table = $("<table width='100%' style='color:#585656;'/>")
           .attr("cellpadding", "0")
           .attr("cellspacing", "0").attr("id", "busTable");;
   if($.trim($("#startStation").val()).length>0){
       $.post(DC.Cfg.siteUrl + "servlet/BUSGoogleServlet", {key: $("#startStation").val()}, function(xml){
           $(xml).find("results result").each(function(){
               var key = $(this).attr("key");
               var count = $(this).attr("count");
               var tr = $("<tr/>").css("cursor", "pointer").css("height", "20px").mouseout(function(){
                   $(this).css("backgroundColor", "white").css("color", "#585656").css("font-weight", "normal");     
               }).mouseover(function(){
                   $(this).css("backgroundColor", "#F0F0FF").css("color", "#585656").css("font-weight", "bold");      
               }).click(function(){
                   $("#startStation").val($(this).find("td").eq(0).html());                        
                    AutoBusComplete.busdel();  
                   
               })
               var td1 = $("<td/>").html(key).css("fontSize", "14px")
                   .css("margin", "5 5 5 5");
             
               tr.append(td1)//.append(td2);
               table.append(tr);
               newDiv.append(table);
           });
       });
       }
       $(document.body).append(newDiv);
     
       if($("#startStation").val() == ""){
           $("#busDiv").remove();
       }
     }catch(e){
         return;
     }             
}

//用于调用Lucene的监控方法 

AutoBusComplete.busEndSuggetsres =  function(){
   try{
        AutoBusComplete.busdel();
        var top = $("#endStation").offset().top;
        var left = $("#endStation").offset().left;
        var newDiv = $("<div/>").width($("#endStation").width() + 6)
            .css("position", "absolute")
            .css("backgroundColor", "white")
            .css("left", left)
            .css("top", top + $("#endStation").height() + 6)
            .css("border", "1px solid #CCCCCC")
            .css("z-index", "1000")
            .attr("id", "busDiv");
          
        var table = $("<table width='100%' style='color:#585656;'/>")
            .attr("cellpadding", "0")
            .attr("cellspacing", "0").attr("id", "busTable");;
    if($.trim($("#endStation").val()).length>0){
        $.post(DC.Cfg.siteUrl + "servlet/BUSGoogleServlet", {key: $("#endStation").val()}, function(xml){
            $(xml).find("results result").each(function(){
                var key = $(this).attr("key");
                var count = $(this).attr("count");
                var tr = $("<tr/>").css("cursor", "pointer").css("height", "20px").mouseout(function(){
                    $(this).css("backgroundColor", "white").css("color", "#585656").css("font-weight", "normal");     
                }).mouseover(function(){
                    $(this).css("backgroundColor", "#F0F0FF").css("color", "#585656").css("font-weight", "bold");      
                }).click(function(){
                    $("#endStation").val($(this).find("td").eq(0).html());                        
                     AutoBusComplete.busdel();  
                    
                })
                var td1 = $("<td/>").html(key).css("fontSize", "14px")
                    .css("margin", "5 5 5 5");
              
                tr.append(td1)//.append(td2);
                table.append(tr);
                newDiv.append(table);
            });
        });
        }
        $(document.body).append(newDiv);
      
        if($("#endStation").val() == ""){
            $("#busDiv").remove();
        }
       }catch(e){
         return;
       }              
}

//对当前startStation元素进行事件绑定

$("#startStation").bind("propertychange", AutoBusComplete.busStartSuggetsres);

//对当前endStation元素进行事件绑定
$("#endStation").bind("propertychange", AutoBusComplete.busEndSuggetsres);
 

//解决火狐上的监控问题
if (window.addEventListener){
      document.getElementById("startStation").addEventListener("input", AutoBusComplete.busStartSuggetsres, false);
      document.getElementById("endStation").addEventListener("input", AutoBusComplete.busEndSuggetsres, false); 
}   

 

原创粉丝点击