同时借此文感谢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/