天天看点

TRIP数据库检索的一个主要方法

package com.ninemax.util; 

import java.util.ArrayList; 

import java.util.List; 

import com.tietoenator.trip.jtk.*; 

import com.ninemax.database.trip.*; 

import com.ninemax.entity.GeneralResult; 

/** 

 * Trip数据库测试类-模糊检索-只显示相关的段落 

 * @author han 

 */ 

public class MyTrip { 

    /** 

     * 将字符串由ISO8859-1转位GBK编码 

     * @param str 要转码的字符串 

     * @return String 

     */ 

    public static String convert(String str) { 

        try { 

            byte[] bytesStr = str.getBytes("ISO-8859-1"); 

            return new String(bytesStr, "GBK"); 

        } catch (Exception ex) { 

            return str; 

        } 

    } 

     * 将字符串由GBK转为ISO8859-1编码 

     * @param str 需要转码的字符串 

    public static String deConvert(String str) { 

            byte[] bytesStr = str.getBytes("GBK"); 

            return new String(bytesStr, "ISO-8859-1"); 

     * 对TRIP数据库进行模糊检索-只显示相关的段落 

     * @param keyword 检索的关键词 

     * @return List集合 

    public List<GeneralResult> getResult(int intPageSize,long intPagex,String keyword){ 

    /* 

说明:GeneralReSult是一个封装类。里面是一些我们需要的记录的属性。  

*/ 

        //intPage表示当前页 

        int intPage = (int) intPagex;  

        /**这是模糊查找 */ 

        String strfind ="content="+keyword; 

        //要连接的主机IP地址 

        String tripIP = "192.168.15.11"; 

        //要连接的数据库的名称 

        String tripDB = "mydb"; 

        //TRIP数据库的登陆者名称 

        String tripUserName = "system"; 

        //TRIP数据库的登陆者密码 

        String tripPassword = "trip413"; 

        int FindRecordNumber = 0; 

        double second1 = 0.0, second2 = 0.0; 

        //下面为初始化TRIP数据库的连接池 

         TripPoolManage tpm = TripPoolManage.getInstance(); 

            TripPoolManager TPool = tpm.getTripPool(); 

            if (TripPoolManager.IsExistPool() == false) { 

                int poolSize =1;//连接池最大用户数 

                String usernames[]=new String[poolSize]; 

                String passwrods[]=new String[poolSize]; 

                for(int i=0;i<poolSize;i++){ 

                    usernames[i]=tripUserName; 

                    passwrods[i]=tripPassword; 

                } 

                tpm.createPool( tripDB, tripIP, usernames,passwrods,poolSize,10000,0); 

            } 

        TripSession TSession; 

        Database db = null; 

        Search srh = null; 

        Record rec = null; 

        TField fld = null; 

        Session trip = null;//SessionManager.session(); 

        TSession = TPool.getConnection("UserPool1", "User1", tripIP); 

            trip = TSession.getSession(); 

            db = trip.database(tripDB); 

            db.open(); 

            second1 = System.currentTimeMillis(); 

            //执行CCL中的find命令,即:find jgdm=xxx 

            trip.find(deConvert(strfind)); 

            second2 = System.currentTimeMillis(); 

            //session对象的getRecordCount()方法:获取find方法最新搜索发现的记录数 

            FindRecordNumber = trip.getRecordCount(); 

            try{ 

//Session对象的search(int p)方法:表示创建一个新的搜索对象,当p=0时,表示最新的搜索被使用 

                srh = trip.search(0); 

            }catch (Exception e){ 

                trip = TSession.getSession(); 

                //session对象的database(String dbNames):创建一个新的数据库对象 

                db = trip.database(tripDB); 

                //打开要访问的数据库 

                db.open(); 

    //session对象的getRecordCount()方法:获取find方法最新搜索发现的记录数 

                FindRecordNumber = trip.getRecordCount(); 

            String strauthor = ""; 

            String strcontent = ""; 

/* 

说明:strauthor  ,  strcontent是trip数据库mydb中的两个字段名称,同时也是我们自己封装的类GeneralResult的两个属性。 

不同的数据库的字段不同。我们所要查的字段也不同,我们需要查那些字段,在此就写那些字段!!! 

            int rid = 0; 

            //k1表示:每一个list集合中的第一个记录 

            int k1 = intPageSize * (intPage - 1) + 1; 

            int x = 0; 

            if(FindRecordNumber>0){ 

                if (FindRecordNumber - (intPageSize * (intPage - 1)) < intPageSize) { 

            //当剩下的记录不足一个intPageSize时,我们要自己设置新的每页显示条数 

                    x = FindRecordNumber - (intPageSize * (intPage - 1)); 

                } else { 

                    x = intPageSize; 

            List<GeneralResult> list = new ArrayList<GeneralResult>(); 

            for (int i = k1; i < (k1 + x); i++) { 

                GeneralResult result=new GeneralResult();  

                result.setIndexNo(i); 

                result.setTotalNum(convert(String.valueOf(FindRecordNumber))); 

                result.setUseTime(convert(String.valueOf((second2 - second1) / 1000.0))); 

                rec = srh.record(i); 

                rid = rec.getRID(); 

                result.setRid(rid); 

                //author字段 

                fld = rec.field("author"); 

                strauthor = fld.getValue(); 

                if(strauthor == null) { 

                    strauthor = ""; 

        result.setAuthor(convert(strauthor)); 

说明:上面的几行代码就查出数据库里author字段的某个记录, 

并封装到GeneralReSult类中。 

                //content字段 

                fld = rec.field("content"); 

                strcontent = fld.getValue(); 

                //拿到该记录中该字段中段落数,即:paraNum 

                int paraNum = fld.getParagraphCount(); 

                //下面要拿到每一个段落的内容 

                for(int j = 1; j<=paraNum; j++) { //注意:段落也是从1开始的。 

                    String value1 = null; 

                    String value2 = null; 

                    String value = null; 

                    if(j == paraNum) { 

                        //拿到最后一段的内容 

                        value = fld.getValue(paraNum); 

                    } else { 

                        //拿到除最后一段的每一段的内容 

                        value1 = fld.getValue(j); 

                        value2 = fld.getValue(j+1); 

                        value = value1.substring(0,value1.indexOf(value2)); 

                    } 

                    //判断每一段是否包含检索词 

                    /** 

                     * 2011.12.28日修改,如果一篇文章中有一个符合要求的段落, 

                     * 那么我们结束该篇文章段落的循环→节省资源,提高性能! 

                     */ 

                    if(convert(value.trim()).contains(keyword)) { 

                        //如果该段落包含检索词,我们将该段落以及相应的作者封装到GeneralResult5对象中 

                        result.setContent(convert(strcontent)); 

                        result.setNum(j); 

                        result.setParagraph(convert(value)); 

                        break; 

说明:以上的绿色部分,视具体情况而定,此时是我做的一个例子!如果你不需要查相应的段落,就不需要的!!  只要最后把result对象装入相应的集合中就行了! 

                list.add(result); 

            TPool.closeConnection(TSession); 

            return list; 

        } catch (Exception e) { 

            trip.endSession(); 

            TPool.destroyPool(); 

            TPool.cleanUp(); 

            return new ArrayList<GeneralResult>(); 

    }    

    你在此处做一个main方法,就可以测试上面的代码了!!我就不做了!真的需要的话,去下载就行了!我上传过例子!! 

———————————————————————————————————————————————————— 

 * 封装了检索出来的一些信息 

 * @author hanlw 

 * 

public class GeneralResult { 

    //相应的作者 

    String author; 

    //符合要求的段落 

    String paragraph; 

    //记录一下该段落是第几段 

    int num; 

    //整篇的内容 

    String  content; 

    //记录号 

    int rid; 

    //总的记录数 

    String totalNum; 

    //查询费时 

    String useTime; 

    //起始位置 

    int indexNo; 

    //以下是get…set方法。。。。 

---------------------------------------------------------------- 

下面是一个工具类: 

public class TripPoolManage 

  private static TripPoolManage pool = new TripPoolManage(); 

  private static int intConnectTimes = 0; 

  private static int cleanupNumber = 0; 

  private static TripPoolManager TPool = TripPoolManager.getInstance(); 

  public static TripPoolManage getInstance() 

  { 

    return pool; 

  } 

  public TripPoolManager getTripPool() { 

    return TPool; 

  public void createPool(String tripDB, String tripIP, String[] tripUserName, String[] tripPassword, int connectNumber, int cleanNumber, long refreshTimes) 

    if (!TripPoolManager.IsExistPool()) 

    { 

      TPool.setPoolsAmount(1); 

      TPool.setPoolParam("UserPool1", 1, tripIP, 23457,  

        tripUserName, tripPassword, "trip628.ini", connectNumber,  

        connectNumber, 1, 40000L, "16450", "16898", 50000L); 

      TPool.createTripConnectPool(); 

      cleanupNumber = cleanNumber; 

      TripPoolManager.setCleanUpTime(refreshTimes); 

      TripPoolManager.StartCleanUp(); 

  public TripSession getConnection(String username, String ip) 

    throws IOException 

    intConnectTimes += 1; 

    if (intConnectTimes >= cleanupNumber) 

      TPool.cleanUp(); 

      intConnectTimes = 0; 

    return TPool.getConnection("UserPool1", username, ip); 

  public int getConnectTimes() { 

    return intConnectTimes; 

     本文转自韩立伟 51CTO博客,原文链接:http://blog.51cto.com/hanchaohan/779535,如需转载请自行联系原作者