- 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 需要转码的字符串
- * @return String
- */
- public static String deConvert(String str) {
- try {
- byte[] bytesStr = str.getBytes("GBK");
- return new String(bytesStr, "ISO-8859-1");
- } catch (Exception ex) {
- return str;
- }
- }
- /**
- * 对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);
- try {
- 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();
- srh = trip.search(0);
- }
- 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) {
- TPool.closeConnection(TSession);
- 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,如需转载请自行联系原作者