• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

基于文件系统的全文检索之我见

发布: 2007-7-04 13:34 | 作者: admin | 来源:  网友评论 | 查看: 9次 | 进入软件测试论坛讨论

领测软件测试网
                 上周5做全文检索,遇到很多问题,在这里写出来。
                 同时借此文感谢sonymusic对我写这个程序的帮助。

    以前听别人说全文检索,大都数都是在Microsoft的SQLServer基础上做全文检索,到现在我还没有弄明白SQLServer是怎么来做全文检索的,因为我一直没有用SQLServer作过这方面的工作。倒是依稀记得很久以前在chinaasp看到过一篇文章,好像是用asp借助fso组件来实现基于文件系统的全文检索。但是那篇文章我也没有看多大懂,那时候还是刚刚开始用asp,很多东西不明白,现在想找那篇文章,却找不到了。
    
   刚好那天有一个机会让我来做全文检索,要求当然不能用SQLServer了。因为我们的数据库系统是Oracle服务器Linux。开始的时候,没有头绪,我就想到了上面提到的那篇文章。于是我想借助java的File对象来做。刚好不久前做了一个遍历文件系统的程序,于是,我想到只要在这个程序的基础上加上在文件中查找关键字的功能,一个全文检索的功能不就出来了吗。
   首先我要实现的是查找一个文件中的文字。思路是这样的,将文件读入变量,然后从这个变量中查找对应的文字,如果有,返回true,否则返回false。
   但是,碰到一个问题,要检索的文件并不都是txt文件呀,还有可能会有doc文件。文件格式对于数据的存储肯定是有影响的。例如,一个txt文件和一个word文件,里面都有相同的汉字“中国”,但是用ultraedit打开,word中却不能照到“中国”两个字,也就是说,在doc文件中,Microsoft对文字的存储和在txt或者其他text类型的文件中存储方式是不一样的。
   我想到了windows本身的查找功能,应该称的上windows下的全文检索吧。里面有一个选项:包含文字。于是做了一个实验:在d:盘建立3个文件a.txt,b.txt,c.doc,a和b分别用记事本创建,里面都写上“中国”,c用word创建,里面也写入“中国”,并保存。然后将b.txt的后缀改成b.doc,并且不用word打开。然后用windows的查找功能查找d:盘上包含“中国”文字的文件,结果出来的是a.txt和b.doc。然后把b用word打开并且保存。然后再查,这时候只能查出a.txt。我觉得已经很能够说明问题了,windows的查找,并不能找到word文件中的“中国”。
   这样一来,我就能够为自己作不到的事情开脱罪责了。
   下面就是我写检索文件中字符的方法,不敢说是最好的方法,但肯定是可行的方法,不过同样不能检索word中的字符。
   将文件读入一个byte数组,然后将要检索的文件也读入一个byte数组,然后将这两个数组都toString。然后用String类的indexOf()方法来却定是否含有这个文字,如果有,则返回true,反之返回false。

下面是代码:
package lovefan.fulltextsearch;
/**
* Title:
* Description:
* Copyright:    Copyright (c) 2001
* Company:      Individual
* @author 胡磊lovefan@cmmail.com
* @version 1.0
*/
import java.io.*;

public class CheckFile {


  /**
   * static boolean CheckFile(String filePath,String text)
   * 功能:
   *   检查文件filePath里面是否含有text字符
   *
   * 返回值:
   *   如果检测到,返回true
   *   如果没有检测到,返回false
   *
   * 参数:
   *   filePath:被检测文件的全路径
   *   text:要查找的字符串
   *
   * 用途:
   *   可以用在文件检索,全文检索等情况
   */
  public static boolean Check(String filePath,String text){
    try {
      File file=new File(filePath);
      long fileLength=0;
      fileLength=file.length();
      FileInputStream fis=new FileInputStream(filePath);
      byte[] buf=new byte[(int)fileLength];
      int bytesRead=0;
      StringBuffer sbfFile=new StringBuffer();
      StringBuffer sbfText=new StringBuffer();
      String src="";
      String search="";

      while((bytesRead=fis.read(buf))!=-1){
        for (int i = 0; i < buf.length; i++) {
          sbfFile=sbfFile.append(buf[i]);
        }
      }
      src=sbfFile.toString();

      byte[] bufText=new byte[text.length()];
      bufText=text.getBytes();
      for (int j = 0; j < bufText.length; j++) {
        sbfText=sbfText.append(bufText[j]);
      }
      search=sbfText.toString();

      if(src.indexOf(search)>0){
        return true;
      }
      else{
        return false;
      }

    }
    catch (Exception ex) {
        return false;
    }
  }
}
这个程序还是有很多缺点:
1、不能检索word、excle中的字符
2、程序效率不高(byte[]变成String的方式不好)
3、如果被检索的文件太大,会造成数据溢出。

如果哪位朋友对全文检索比较感兴趣或者有更深入的研究,请多多指教。
Email:lovefan@cmmail.com
QQ:8482322

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网