lucene測試案例源碼

1、測試準備

測試環境:Mac+JDK1.6java

測試工具:eclipse4.3,mysqlmysql

lucene版本:lucene4.0sql

主要Jar包:ant- 1.8.2.jar、junit-4.10.jar、junit4-ant-2.0.1.jar、lucene-analyzers-common- 4.0.0.jar、lucene-codecs-4.0.0.jar、lucene-core-4.0.0.jar數據庫

lucene- join-4.0.0.jar、lucene-memory-4.0.0.jar、lucene-queries-4.0.0.jar、lucene- queryparser-4.0.0.jar、lucene-test-framework-4.0.0.jardom

mysql-connector-java-5.1.19-bin.jar、randomizedtesting-runner-2.0.1.jareclipse

2、測試代碼:

1)新建Java工程:建立對象實體類——User工具

/**單元測試

 * 實體對象測試

 * @author zzgthis

 *

 */

public class User {

    private Integer userId;

    private String rpsId;

    private String userType;

    private Integer personId;

    public Integer getUserId() {

        return userId;

    }

    public void setUserId(Integer userId) {

        this.userId = userId;

    }

    public String getRpsId() {

        return rpsId;

    }

    public void setRpsId(String rpsId) {

        this.rpsId = rpsId;

    }

    public String getUserType() {

        return userType;

    }

    public void setUserType(String userType) {

        this.userType = userType;

    }

    public Integer getPersonId() {

        return personId;

    }

    public void setPersonId(Integer personId) {

        this.personId = personId;

    }

}

2)建立鏈接數據源類——DBSource

/**
 * 連接數據源
 * @author zzg
 *
 */
public class DBSource {
    private String password="數據庫祕密";
    private String url="jdbc:mysql://數據庫ip:端口/數據庫名稱?autoReconnect=true&characterEncoding=utf8";
    private String userName="登陸名";
    private static final String JDBC_DRIVER="com.mysql.jdbc.Driver";
    private Statement st;
    private Connection conn;
    private ResultSet rs;
    
    /**
     * 內部類得到數據源對象
     */
    private static class DBInstance{
        public final static DBSource instance= new DBSource();
    }
    public static DBSource getInstance(){
        return DBInstance.instance;
    }
    /**
     *鏈接數據庫
     */
    public Connection getConn(){
        try {
            Class.forName(JDBC_DRIVER);
            conn=DriverManager.getConnection(url,userName,password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
    /**
     * 建立執行SQL
     */
    public Statement getStm(){
        conn = getConn();
        try {
            st=conn.createStatement();
            return st;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 返回結果集
     */
    public ResultSet getResult(String sql){
        st=getStm();
        try {
            rs=st.executeQuery(sql);
            return rs;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 處理關閉按鈕
     */
    public void close(){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(st!=null){
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

3)創lucene核心處理類——LuceneUtil

/**
 * lucene核心測試處理方法
 * @author zzg
 *
 */
public class LuceneUtil {
    
    public static final String INDEX_DIRECTORY = "/Users/zzg/Documents/workspace/luceneDir";
    public static final String WRITE_LOCK_NAME="write.lock";
    //private static Analyzer analyzer = new IK_CAnalyzer();
    private static StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
    /**
     * 建立索引庫
     */
    @SuppressWarnings("deprecation")
    public void createIndex(){
        try {
            //true 表示每此都建立一個新的文件夾,false表示每次都覆蓋
            FSDirectory dir = FSDirectory.open(new File(INDEX_DIRECTORY));
            IndexWriterConfig config =new IndexWriterConfig(Version.LUCENE_40, analyzer);
            IndexWriter indexWriter=new IndexWriter(dir, config);
            DBSource dbSource = DBSource.getInstance();
            //DBSource dbSource = new DBSource();
            Connection conn=dbSource.getConn();
            Statement stm = null;
            ResultSet rs = null;
            String sql="select user_id,rps_id,user_type,person_id from   表名";
            stm=dbSource.getStm();
            rs=dbSource.getResult(sql);
            List<User> list = new ArrayList<User>();
            try {
                while(rs.next()){
                    User user = new User();
                    user.setUserId(rs.getInt(1));
                    user.setRpsId(rs.getString(2));
                    user.setUserType(rs.getString(3));
                    user.setPersonId(rs.getInt(4));
                    list.add(user);
                }
                System.out.println("總記錄條數:"+list.size());
                
                for (int i = 0; i < list.size(); i++) {
                    //建立一個lucene索引
                    Document document = new Document();
                    String userId=list.get(i).getUserId().toString();
                    String rpsId=list.get(i).getRpsId();
                    String userType=list.get(i).getUserType();
                    String personId=list.get(i).getPersonId().toString();
                    //將用戶ID添加到索引文件中並高亮顯示
                    document.add(new Field("userId" , userId , Field.Store.YES , Field.Index.ANALYZED , Field.TermVector.WITH_POSITIONS_OFFSETS));
                    document.add(new Field("rpsId" , rpsId , Field.Store.YES , Field.Index.ANALYZED , Field.TermVector.WITH_POSITIONS_OFFSETS));
                    document.add(new Field("userType" , userType , Field.Store.YES , Field.Index.ANALYZED , Field.TermVector.WITH_POSITIONS_OFFSETS));
                    document.add(new Field("personId" , personId , Field.Store.YES , Field.Index.ANALYZED , Field.TermVector.WITH_POSITIONS_OFFSETS));
                    //document.add(new Field("rpsId" , rpsId , Field.Store.YES , Field.Index.ANALYZED , Field.TermVector.WITH_POSITIONS_OFFSETS));
                    indexWriter.addDocument(document);
                }
                //System.out.println(list.size());
                
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                indexWriter.close();
                dbSource.close();
                if(IndexWriter.isLocked(dir)){
                    dir.makeLock(WRITE_LOCK_NAME);
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * 索引查詢
     */
    public List<PO> searcheFile(String keyword) throws IOException, ParseException{
        Date startTime= new Date(System.currentTimeMillis());
        System.out.println("開始時間:"+getDate(startTime));
        Directory ireader = FSDirectory.open(new File(INDEX_DIRECTORY));
        //System.out.println(iread);
        System.out.println();
        IndexReader reader = DirectoryReader.open(ireader);
        IndexSearcher searcher=new IndexSearcher(reader);
        QueryParser parser = new QueryParser(Version.LUCENE_40, "userType", analyzer);
        Query query = parser.parse(keyword);
        TopScoreDocCollector topScoreDocCollector = TopScoreDocCollector.create(100, true);  
        searcher.search(query, topScoreDocCollector);  
        //處理返回結果集
        ScoreDoc[] docs = topScoreDocCollector.topDocs().scoreDocs;
       System.out.println("總記錄數:"+topScoreDocCollector.getTotalHits());
        for (int i = 0; i < docs.length; i++) {
            //ScoreDoc scoreDoc = hits[i];
            Document result = searcher.doc(docs[i].doc);
        }
        Date endTime= new Date(System.currentTimeMillis());
        System.out.println("結束時間:"+getDate(endTime));
        System.out.println("經過lucene索引查詢總計用時:"+(endTime.getTime()-startTime.getTime()));
        System.out.println("================================================================");
        reader.close();
        return null;
        
    }
    /**
     * 經過sql語句查詢
     */
    public void searchBySql(String columName,Object value){
        DBSource dbSource = DBSource.getInstance();
        //DBSource dbSource = new DBSource();
        Connection conn=dbSource.getConn();
        Statement stm = null;
        ResultSet rs = null;
        String sql="select user_id,rps_id,user_type,person_id from linksus_relation_weibouser where "+columName+"="+value;
        stm=dbSource.getStm();
        Date startTime=new Date();
        System.out.println(getDate(startTime));
        rs=dbSource.getResult(sql);
        List<User> list = new ArrayList<User>();
        try {
            while(rs.next()){
                User user = new User();
                user.setUserId(rs.getInt(1));
                user.setRpsId(rs.getString(2));
                user.setUserType(rs.getString(3));
                user.setPersonId(rs.getInt(4));
                list.add(user);
            }
            System.out.println("總記錄條數:"+list.size());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            dbSource.close();
        }
        Date endTime=new Date();
        System.out.println(getDate(endTime));
        System.out.println("經過sql語句直接查詢總計用時:"+(endTime.getTime()-startTime.getTime()));
    }
    /**
     * 時間格式化處理
     */
    public String getDate(Date time){
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-ss hh:mm:ss ssss");
        String dateStr=dateFormat.format(time);
        return dateStr;
    };
}
4)測試類——Junit 單元測試

測試user_type=1或2

public class Test {
    @org.junit.Test
    public void testIndex() throws IOException, ParseException{
         LuceneUtil lu = new LuceneUtil();
         //建立索引
         //lu.createIndex();
         //經過索引查詢user_type=1的數據
         lu.searcheFile("1");
         //經過直接查詢數據庫查詢user_type=1的數據
         lu.searchBySql("user_type",1);
    }
}

測試結果:

user_type

lucene索引查詢

sql直接查詢

1

總記錄數:174448

用時:637~545毫秒

總記錄數:174448

用時:2966~2035毫秒
2

總記錄數:27996

用時:601~565毫秒

總記錄數:27996

用時:1228~745毫秒

相關文章
相關標籤/搜索