精华内容
下载资源
问答
  • 目前在做一个winform小软件,其中有一个功能是能根据关键字检索本地保存的word文档。第一次是用com读取word方式(见上一篇文章),先遍历文件夹下的word文档,读取每个文档时循环关键字查找,结果可想而知效率很慢。...

    目前在做一个winform小软件,其中有一个功能是能根据关键字检索本地保存的word文档。第一次是用com读取word方式(见上一篇文章),先遍历文件夹下的word文档,读取每个文档时循环关键字查找,结果可想而知效率很慢。检索结果是一条接一条显示出来的o(>_<)o ~~。连菜鸟级别的自己看到这效率都觉得很无语。然后想到计算机的本地搜索及google,百度搜索引擎,它们能做到在海量文件中快速搜到匹配某些关键字的文件,应该是运用其它比较先进成熟的技术来实现。于是上网搜了好多资料,发现有一种叫lucene的全文搜索引擎架构。连忙下了一些demo及源码来学,但对于在编程方面还是菜鸟级别的人来说,这些很高深!呼(~ o ~)~zZ……赶鸭子上架,还是硬着头皮慢慢弄了。。。

    大致了解了下,我是用C#的,所以要用lucene.net框架,还需要有分词器,lucene.net可以在nuget组件管理中搜到,直接下载到项目中,分词器nuget上也可以搜到。。大概的思路是:遍历文件夹,读取文档内容,进行分词、建索引……

    代码:

     

    一、声明索引文件位置,名称,分词器

    1 string filesDirectory = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Files");
    2  static   string indexDirectory = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Index");
    3   // Analyzer analyzer = new Lucene.Net.Analysis.Cn.ChineseAnalyzer();
    4 static Analyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);//用standardAnalyzer分词器

    StandardAnalyzer分词器与ChineseAnalyzer分词器的区别:

    对“123木头人”这句话进行分词,StandardAnalyzer的分词结果:1 2 3 木 头 人;ChineseAnalyzer的分词结果:木 头 人,把数字过滤了。

     

    二、遍历文件夹及文件,创建索引

      1         /// <summary>
      2         /// 创建索引按钮事件
      3         /// </summary>
      4         private void btnSetIndex_Click(object sender, EventArgs e)
      5         {
      6             this.folderBrowserDialog1.ShowDialog();
      7             string rootPath = this.folderBrowserDialog1.SelectedPath; 
      8             if(rootPath!="")
      9             {
     10                 GetAllFiles(rootPath);
     11                 MessageBox.Show("创建索引完成!");
     12                 }
     13         }
     14 
     15         /// <summary>
     16         /// 获取指定根目录下的子目录及其文档
     17         /// </summary>
     18         /// <param name="rootPath">检索的文档根目录</param>
     19         private void GetAllFiles(string rootPath)
     20         {
     21             List<FileInfo> files = new List<FileInfo>(); //声明一个files包,用来存储遍历出的word文档
     22             if (!System.IO.Directory.Exists(rootPath))
     23             {
     24                 MessageBox.Show("指定的目录不存在");
     25                 return;
     26             }
     27             GetAllFiles(rootPath, files);
     28             CreateIndex(files); //创建索引方法       
     29         }
     30 
     31         /// <summary>
     32         /// 获取指定根目录下的子目录及其文档
     33         /// </summary>
     34         /// <param name="rootPath">根目录路径</param>
     35         /// <param name="files">word文档存储包</param>
     36          private void GetAllFiles(string rootPath,List<FileInfo>files)
     37          {
     38             DirectoryInfo dir = new DirectoryInfo(rootPath);
     39             string[] dirs = System.IO.Directory.GetDirectories(rootPath);//得到所有子目录
     40             foreach (string di in dirs)
     41             {
     42                 GetAllFiles(di,files); //递归调用
     43             }
     44             FileInfo[] file = dir.GetFiles("*.doc"); //查找word文件        
     45             //遍历每个word文档            
     46             foreach (FileInfo fi in file)
     47             {
     48                 string filename = fi.Name;
     49                 string filePath = fi.FullName;
     50                 object filepath = filePath;
     51                 files.Add(fi);
     52             }
     53         }
     54 
     55        
     56         /// <summary>
     57         /// 创建索引
     58         /// </summary>
     59         /// <param name="files">获得的文档包</param>
     60          private void CreateIndex(List<FileInfo> files)
     61          {
     62              bool isCreate = false;
     63              //判断是创建索引还是增量索引
     64              if (!System.IO.Directory.Exists(indexDirectory))
     65              {
     66                  isCreate = true;
     67              }
     68              IndexWriter writer = new IndexWriter(FSDirectory.Open(indexDirectory),analyzer,isCreate,IndexWriter.MaxFieldLength.UNLIMITED);  //FSDirectory表示索引存放在硬盘上,RAMDirectory表示放在内存上
     69              for (int i = 0; i < files.Count(); i++)
     70              {
     71                  //读取word文档内容
     72                  Microsoft.Office.Interop.Word.ApplicationClass wordapp = new Microsoft.Office.Interop.Word.ApplicationClass();
     73                  string filename = files[i].Name;
     74                  object file = files[i].DirectoryName + "\\" + filename;
     75                  object isreadonly = true;
     76                  object nullobj = System.Reflection.Missing.Value;
     77                  Microsoft.Office.Interop.Word._Document doct = wordapp.Documents.Open(ref file, ref nullobj, ref isreadonly, ref nullobj, ref nullobj, ref nullobj, 
    ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj, ref nullobj); 78 //doct.ActiveWindow.Selection.WholeStory(); 79 //doct.ActiveWindow.Selection.Copy(); 80 //IDataObject data = Clipboard.GetDataObject(); 81 ////读出的内容赋给content变量 82 //string content = data.GetData(DataFormats.Text).ToString(); 83 string content = doct.Content.Text; 84 FileInfo fi = new FileInfo(file.ToString()); 85 string createTime = fi.CreationTime.ToString(); 86 string filemark = files[i].DirectoryName + createTime; 87 //关闭word 88 object missingValue = Type.Missing; 89 object miss = System.Reflection.Missing.Value; 90 object saveChanges = WdSaveOptions.wdDoNotSaveChanges; 91 doct.Close(ref saveChanges, ref missingValue, ref missingValue); 92 wordapp.Quit(ref saveChanges, ref miss, ref miss); 93 // StreamReader reader = new StreamReader(fileInfo.FullName);读取txt文件的方法,如读word会出现乱码,不适用于word的读取 94 Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document(); 95 96 writer.DeleteDocuments(new Term("filemark", filemark)); //当索引文件中含有与filemark相等的field值时,会先删除再添加,以防出现重复 97 doc.Add(new Lucene.Net.Documents.Field("filemark", filemark, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NOT_ANALYZED)); //不分词建索引 98 doc.Add(new Lucene.Net.Documents.Field("FileName", filename, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.ANALYZED)); //ANALYZED分词建索引 99 doc.Add(new Lucene.Net.Documents.Field("Content", content, Lucene.Net.Documents.Field.Store.NO, Lucene.Net.Documents.Field.Index.ANALYZED)); 100 doc.Add(new Lucene.Net.Documents.Field("Path", file.ToString(), Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.ANALYZED)); 101 writer.AddDocument(doc); 102 writer.Optimize();//优化索引 103 } 104 writer.Dispose(); 105 }

     

    三、根据关键字检索

     1         /// <summary>
     2         /// 检索关键字
     3         /// </summary>
     4         /// <param name="strKey">关键字包</param>
     5         private void SearchKey(List<string> strKey)
     6         {
     7             int num = 10;
     8             if (strKey.Count != 0)
     9             {
    10                 IndexReader reader = null;
    11                 IndexSearcher searcher = null;
    12                 try
    13                 {
    14                     if (!System.IO.Directory.Exists(indexDirectory))
    15                     {
    16                         MessageBox.Show("首次使用该软件检索 必须先创建索引!"+ "\r\n"+"请点击右边【创建索引】按钮,选择要检索的文件夹进行创建索引。");
    17                         return;
    18                     }
    19                     reader = IndexReader.Open(FSDirectory.Open(new DirectoryInfo(indexDirectory)), false);
    20                     searcher = new IndexSearcher(reader);
    21 
    22                     //创建查询
    23                     PerFieldAnalyzerWrapper wrapper = new PerFieldAnalyzerWrapper(analyzer);
    24                     wrapper.AddAnalyzer("FileName", analyzer);
    25                     wrapper.AddAnalyzer("Content", analyzer);
    26                     wrapper.AddAnalyzer("Path", analyzer);
    27                     string[] fields = { "FileName", "Content", "Path" };
    28                     QueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, fields, wrapper);
    29                     BooleanQuery Bquery = new BooleanQuery();
    30                     for (int i = 0; i < strKey.Count; i++)
    31                     {
    32                         Query query = parser.Parse(strKey[i]);
    33                         Bquery.Add(query, Occur.MUST);
    34                     }
    35 
    36                     TopScoreDocCollector collector = TopScoreDocCollector.Create(num, true);
    37                     searcher.Search(Bquery, collector);
    38                     var hits = collector.TopDocs().ScoreDocs;
    39                     //以后就可以对获取到的collector数据进行操作
    40                     int resultNum = 0; //计算检索结果数量
    41                     for (int i = 0; i < hits.Count(); i++)
    42                     {
    43                         var hit = hits[i];
    44                         Lucene.Net.Documents.Document doc = searcher.Doc(hit.Doc);
    45                         Lucene.Net.Documents.Field fileNameField = doc.GetField("FileName");
    46                         Lucene.Net.Documents.Field contentField = doc.GetField("Content");
    47                         Lucene.Net.Documents.Field pathField = doc.GetField("Path");
    48                         if (!System.IO.File.Exists(pathField.StringValue)) //判断本地是否存在该文件,存在则在检索结果栏里显示出来
    49                         {
    50                             int docId = hit.Doc; //该文件的在索引里的文档号,Doc是该文档进入索引时Lucene的编号,默认按照顺序编的
    51                             reader.DeleteDocument(docId);//删除该索引
    52                             reader.Commit();
    53                             continue;
    54                         }                       
    55                             dtBGMC.Rows.Add(fileNameField.StringValue, pathField.StringValue);
    56                             resultNum++;
    57                     }
    58                     MessageBox.Show("检索完成!共检索到" +resultNum+ "个符合条件的结果!", "success!");
    59                 }
    60                 finally
    61                 {
    62                     if (searcher != null)
    63                         searcher.Dispose();
    64 
    65                     if (reader != null)
    66                         reader.Dispose();                  
    67                 }
    68             }
    69             else
    70             {
    71                 MessageBox.Show("请输入要查询的关键字!");
    72                 return;
    73             }
    74         }
    75        

     

    作者:goodgirlmia
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    转载于:https://www.cnblogs.com/goodgirlmia/p/3712116.html

    展开全文
  • 使用PageOffice开发平台,实现对word文档的在线处理,并搜索、显示含有关键字的文档。... 然后是关键字搜索功能,我们通过数据库中存储Word文档纯文本的字段,利用sql语句将包含关键字的文档搜索出来。
  • ELK详细搭建及使用笔记word文档,包含所需文件下载地址。通过ELK(ElasticSearch + LogStash + Kibana = ELKStack),轻松几步搭建ELK环境,对数据进行实时监控和分析。 Elasticsearch是个开源分布式搜索引擎,...
  • 类似的工具诸如DocFetcher,Mendeley里面全文检索功能等。可以试下用DocFetcher来了解相关的功能。 可以基于Lucene这个文本索引的库来做;可以通过一个叫做lukeall软件来查看lucene索引中的文档内容。 实现 1

    需求

    1. 借助第三方工具对本地的文档(包含但不局限于txt、PDF、word、excel、PowerPoint)中的文本内容进行全文检索
    2. 支持用户输入文本进行查询,查询出来的文本,应该在界面中给予高亮
    3. 有图形化的界面,支持在整个程序中直接打开相应的文档或者文件

    提示

    类似的工具诸如DocFetcher,Mendeley里面全文检索功能等。可以试下用DocFetcher来了解相关的功能。

    可以基于Lucene这个文本索引的库来做;可以通过一个叫做lukeall软件来查看lucene索引中的文档内容。

    实现

    1、解析不同文件类型的工具类

    import java.io.File;
    import java.io.FileInputStream;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    /**  
    *excel文件解析工具类
    */
    public class ExcelParse {
    	public static String parseFile(String filePath){
    		StringBuffer sb=new StringBuffer();
    		try {
                File excel = new File(filePath);
                if (excel.isFile() && excel.exists()) {   //判断文件是否存在
                    String[] split = excel.getName().split("\\.");  //.是特殊字符,需要转义!!!!!
                    Workbook wb;
                    //根据文件后缀(xls/xlsx)进行判断
                    if ( "xls".equals(split[1])){
                        FileInputStream fis = new FileInputStream(excel);   //文件流对象
                        wb = new HSSFWorkbook(fis);
                    }else if ("xlsx".equals(split[1])){
                        wb = new XSSFWorkbook(excel);
                    }else {
                        System.out.println("文件类型错误!");
                        return null;
                    }
                    //开始解析
                    Sheet sheet = wb.getSheetAt(0);     //读取sheet 0
                    int firstRowIndex = sheet.getFirstRowNum();   //第一行是列名
                    int lastRowIndex = sheet.getLastRowNum();
                    //System.out.println("firstRowIndex: "+firstRowIndex);
                    //System.out.println("lastRowIndex: "+lastRowIndex);
                    for(int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) {   //遍历行 按行输出
                        //System.out.println("rIndex: " + rIndex);
                        Row row = sheet.getRow(rIndex);
                        if (row != null) {
                            int firstCellIndex = row.getFirstCellNum();
                            int lastCellIndex = row.getLastCellNum();
                            for (int cIndex = firstCellIndex; cIndex < lastCellIndex; cIndex++) {   //遍历列
                                Cell cell = row.getCell(cIndex);
                                if (cell != null) {
                                    sb.append(cell.toString()+"\n");
                                }
                            }
                        }
                    }
                } else {
                    System.out.println("找不到指定的文件");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    		return sb.toString();
    	}
    }
    
    import java.io.File;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.text.PDFTextStripper;
    /**  
    * pdf文件解析工具类
    */
    public class PDFParse {
    	 public static  String parsePDF(String path){
        	String result = "";
        	try{
            	PDDocument document = PDDocument.load(new File(path));
                PDFTextStripper stripper = new PDFTextStripper();
                stripper.setSortByPosition(true);
                for (int p = 1; p <= document.getNumberOfPages(); ++p)
                {
                    stripper.setStartPage(p);
                    stripper.setEndPage(p);
                    String text = stripper.getText(document);
                    result += text;
                }   		
        	}catch(Exception e){
        		e.printStackTrace();
        	}
        	return result;    	
        }
    	 
    	 public static void main(String[] args) {
    		String s =parsePDF("E:\\ftp上传\\ftpTest\\数据库基础知识.pdf");
    		System.out.println(s);
    	 }
    }
    
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import org.apache.poi.POIXMLDocument;
    import org.apache.poi.hslf.extractor.PowerPointExtractor;
    import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
    import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor;
    import org.apache.xmlbeans.XmlException;
    /**  
    * ppt文件解析工具类
    */
    public class PPTParse {
    
    	//直接抽取幻灯片的全部内容
        public static String pptParse(String filePath) throws IOException, XmlException, OpenXML4JException{
        	String content="";
        	if(filePath.toLowerCase().endsWith("ppt")){
        		File file = new File(filePath);
            	FileInputStream fin=new FileInputStream(file);
                PowerPointExtractor extractor=new PowerPointExtractor(fin);
                content=extractor.getText();
        	}else if (filePath.toLowerCase().endsWith("pptx")) {
    			content=new XSLFPowerPointExtractor(POIXMLDocument.openPackage(filePath)).getText();
    		}
            return content;
        }
    }
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    import org.apache.poi.POIXMLDocument;
    import org.apache.poi.POIXMLTextExtractor;
    import org.apache.poi.hwpf.HWPFDocument;
    import org.apache.poi.hwpf.extractor.WordExtractor;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    /**  
    *word文件解析工具类
    */
    public class WordParse {
    	//方式一:返回字符串集合
    	public static List<String> readWord(String filePath) throws Exception{
    		List<String> linList = new ArrayList<String>();
    		String buffer = "";
    		try {
    			if (filePath.endsWith(".doc")) {
    				InputStream is = new FileInputStream(new File(filePath));
    				WordExtractor ex = new WordExtractor(is);
    				buffer = ex.getText();
    				ex.close();
    				if(buffer.length() > 0){
    					//使用回车换行符分割字符串
    					String [] arry = buffer.split("\\r\\n");
    					for (String string : arry) {
    						linList.add(string.trim());
    					}
    				}
    			} else if (filePath.endsWith(".docx")) {
    				OPCPackage opcPackage = POIXMLDocument.openPackage(filePath);
    				POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);
    				buffer = extractor.getText();
    				extractor.close();
    				if(buffer.length() > 0){
    					//使用换行符分割字符串
    					String [] arry = buffer.split("\\n");
    					for (String string : arry) {
    						linList.add(string.trim());
    					}
    				}
    			} else {
    				return null;
    			}
    			
    			return linList;
    		} catch (Exception e) {
    			System.out.print("error---->"+filePath);
    			e.printStackTrace();
    			return null;
    		}
    	}
    	//方式二:返回字符串
    	public static String parseFile(String filePath) {
    		File docFile= new File(filePath);
            String fileName = docFile.getName();
            String docContent = null;
            FileInputStream fis = null;
            try {
                 fis = new FileInputStream(docFile);
                if (fileName.toLowerCase().endsWith("doc")) {
                    HWPFDocument doc = new HWPFDocument(fis);
                    docContent = doc.getDocumentText();
                } else if (fileName.toLowerCase().endsWith("docx")) {
                    XWPFDocument xdoc = new XWPFDocument(fis);
                    XWPFWordExtractor extractor = new XWPFWordExtractor(xdoc);
                    docContent = extractor.getText();
                } else {
                }
            } catch (Exception e) {
            	e.printStackTrace();
            }
            return docContent;     //返回文本内容
        }
    }
    

    注意:解析word时,如果是直接导入jar包的方式,可能会出现XWPFWordExtractor报错信息。需要另外用到依赖包xmlbeans-2.6.0.jar。maven配置方式会直接关联。

    2、创建、查询lucene索引

    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    import org.apache.commons.io.FileUtils;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.document.LongPoint;
    import org.apache.lucene.document.StoredField;
    import org.apache.lucene.document.TextField;
    import org.apache.lucene.index.DirectoryReader;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.search.ScoreDoc;
    import org.apache.lucene.search.TermQuery;
    import org.apache.lucene.search.TopDocs;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.wltea.analyzer.lucene.IKAnalyzer;
    import com.example.tool.ExcelParse;
    import com.example.tool.PDFParse;
    import com.example.tool.PPTParse;
    import com.example.tool.WordParse;
    public class LuceneIndex {
    	static IndexWriterConfig config =null;
    	static IndexWriter indexWriter =null;
    	 private static boolean deleteDir(File dir) {
    	        if (dir.isDirectory()) {
    	            String[] children = dir.list();
    	            //递归删除目录中的子目录下
    	            for (int i=0; i<children.length; i++) {
    	                boolean success = deleteDir(new File(dir, children[i]));
    	                if (!success) {
    	                    return false;
    	                }
    	            }
    	        }
    	        // 目录此时为空,可以删除
    	        return dir.delete();
    	    }
    	 
    	 /**
    	 * 查询字符编码
    	 */
    	public static String codeStringPlus(String fileName) throws Exception {
    		BufferedInputStream bin = null;
    		String code = null;
    		try {
    			bin = new BufferedInputStream(new FileInputStream(fileName));
    			int p = (bin.read() << 8) + bin.read();
    			switch (p) {
    			case 0xefbb:
    				code = "UTF-8";
    				break;
    			case 0xd0cf:
    				code="gb2312";
    				break;
    			case 0xfffe:
    				code = "Unicode";
    				break;
    			case 0xfeff:
    				code = "UTF-16BE";
    				break;
    			default:
    				code = "GBK";
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			bin.close();
    		}
    		return code;
    	}
    	
    	//递归处理目录
    	public static void traverseFolder(File file) throws Exception{
    		File[] files = file.listFiles();
            for (File file1:files){
                //判断当前文件是否为文件夹
                if (file1.isDirectory()){
                    traverseFolder(file1);
                }else{
                	inputStored(indexWriter, file1);
                }
            }
    	}
    	//创建索引
    	public static void createIndex(String dirPath) throws Exception {
          //1、创建一个Directory对象,指定索引库保存的位置。
          //把索引库保存在内存中(保存在内存中,程序关闭就丢失了)
          //Directory directory = new RAMDirectory();
    		String path="E:\\logs\\index";
    		File file = new File(path);
    		if (file.exists()) {
    			deleteDir(file);//每次创建索引库前,先删除之前创建的索引库中的内容
    		}
          //把索引库保存在磁盘
          Directory directory = FSDirectory.open(file.toPath());
          // 2、基于Directory对象创建一个IndexWeiter对象
          //标准分析器
          //IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig());
          config = new IndexWriterConfig(new IKAnalyzer());
          indexWriter = new IndexWriter(directory, config);
          //  3、读取磁盘上的文件,对应每个文件创建一个文档对象。
          File dir = new File(dirPath);
          if (dir.isDirectory()) {
        	  traverseFolder(dir);
          }else{
        	  inputStored(indexWriter, dir);
          }
          //6、关闭indexWriter对象
          indexWriter.close();
       }
    
    	private static void inputStored(IndexWriter indexWriter, File f) throws IOException, Exception {
    		//先取文件名
    		  String fileName = f.getName();
    		  //文件路径
    		  String filePath = f.getPath();
    		  //文件内容
    		  String fileContent="";
    		  if (filePath.toLowerCase().endsWith("ppt") || filePath.toLowerCase().endsWith("pptx")) {
    			  fileContent=PPTParse.pptParse(filePath);
    		  }else if (filePath.toLowerCase().endsWith("xls") || filePath.toLowerCase().endsWith("xlsx")) {
    			fileContent=ExcelParse.parseFile(filePath);
    		 }else if (filePath.toLowerCase().endsWith("pdf")) {
    			fileContent=PDFParse.parsePDF(filePath);
    		 }else if (filePath.toLowerCase().endsWith("doc") || filePath.toLowerCase().endsWith("docx")) {
    			fileContent=WordParse.parseFile(filePath);
    		 }else{
    			 fileContent = FileUtils.readFileToString(f,codeStringPlus(filePath));
    		 }
    		  //文件大小
    		  long fileSize = f.length();
    		  //创建Field域
    		  //参数1:域的名称,参数2:域的内容,参数3:是否存储
    		  Field fieldName = new TextField("name", fileName, Field.Store.YES);
    		  Field fieldPath = new StoredField("path",filePath);
    		  Field fieldContent = new TextField("content", fileContent, Field.Store.YES);
    		  Field fieldSizeValue = new LongPoint("size", fileSize);
    		  Field fieldSizeStore = new StoredField("size", fileSize);
    		  //创建文档对象
    		  Document document = new Document();
    		  //4、向文档对象中添加域
    		  document.add(fieldName);
    		  document.add(fieldPath);
    		  document.add(fieldContent);
    		  //document.add(fieldSize);
    		  document.add(fieldSizeValue);
    		  document.add(fieldSizeStore);
    		  //5、把文档对象写入索引库
    		  indexWriter.addDocument(document);
    	}
    	
    
    	/**
         * 查询索引
         * @throws Exception
         */
        public static Map<String,String> searchIndex(String content) throws Exception {
            //1、创建一个Director对象,指定索引库的位置
            Directory directory = FSDirectory.open(new File("E:\\logs\\index").toPath());
            //2、创建一个IndexReader对象
            IndexReader indexReader = DirectoryReader.open(directory);
            //3、创建一个IndexSearcher对象,构造方法中的参数indexReader对象
            IndexSearcher indexSearcher = new IndexSearcher(indexReader);
            //4、创建一个Query对象,TermQuery  //Term(关键词)包含两部分  关键词所包含的域和关键词本身
            Query query = new TermQuery(new Term("content",content));  //查询content域的包含spring关键词的
            //5、执行查询,得到一个TopDocs对象
            //参数1:查询对象  参数2:查询结果返回的最大记录数
            TopDocs topDocs = indexSearcher.search(query, 10);
            //6、取查询结果的总记录数
            System.out.println("查询总记录数:" + topDocs.totalHits);
            //7、取文档列表
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            Map<String,String> map=new HashMap<String,String>();
            //8、打印文档中的内容
            for (ScoreDoc doc:scoreDocs) {
                //取文档id
                int docId = doc.doc;
                //根据id取文档对象
                Document document = indexSearcher.doc(docId);
                //System.out.println(document.get("name"));
                //System.out.println(document.get("path"));
                //System.out.println(document.get("content"));
                //将文件名作为key,文件内容作为value
                map.put(document.get("name"),document.get("content"));
            }
            //9、关闭IndexReader对象
            indexReader.close();
            return map;
        }
    }
    

    3、窗体类

    public class LuceneJFrame extends JFrame implements ActionListener{
    	JPanel topPane;
    	JScrollPane jp;
    	JLabel lab1;
    	JLabel lab2;
    	JTextField field1;
    	JTextField field2;
    	JButton jButton1;
    	JButton jButton2;
    	static JTextArea tArea;
    	JFileChooser jfc;// 文件选择器 
    	JMenuBar mb;
    	static FgMenu mFile=new FgMenu("文件(F)",KeyEvent.VK_F);//"文件"菜单
    	static JMenuItem miNew=new JMenuItem("新建(N)",KeyEvent.VK_N),
    	miOpen=new JMenuItem("打开(O)...",KeyEvent.VK_O),
    	miSave=new JMenuItem("保存(S)",KeyEvent.VK_S),
    	miFont=new JMenuItem("字体与颜色(F)...",KeyEvent.VK_F),
    	miQuit=new JMenuItem("退出(X)",KeyEvent.VK_X);
    	public LuceneJFrame(String title){
    		super(title);
    		setSize(800, 600);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setLocationRelativeTo(null);//传入参数null 即可让JFrame 位于屏幕中央, 这个函数若传入一个Component ,则JFrame位于该组件的中央
    		topPane = new JPanel();//上面板
    		topPane.setBounds(0,0,800,120);
    		tArea=new JTextArea();//文本域
    		jp=new JScrollPane(tArea);
    		jp.setBounds(0,120,800,440);
    		Font font=new Font("宋体",Font.BOLD,16);
    		tArea.setFont(font);
    		topPane.setLayout(null);//取消JPanel的布局(避免JPanel的setLayout布局与setBounds方法相冲突)
    		this.add(topPane);
    		this.add(jp);
    		this.setLayout(null);
    		luceneIn();
    		dealEvent();
    		addMenus();
    		this.setVisible(true);
    	}
    	
    	public void addMenus(){
    		mb=new JMenuBar();//菜单栏
    		setJMenuBar(mb);
    		mFile.add(miNew);//新建
    		mFile.add(miOpen);//打开
    		mFile.add(miSave);//保存
    		mFile.addSeparator();//分割条
    		mFile.add(miFont);//字体与颜色菜单
    		mFile.addSeparator();//分割条
    		mFile.add(miQuit);//退出		
    		mb.add(mFile); //将"文件"菜单添加到菜单栏上
    	}
    	
    	public void dealEvent(){
    		jButton2.addActionListener(this);
    		jButton1.addActionListener(this);
    		miFont.addActionListener(this);
    		miNew.addActionListener(this);
    		miOpen.addActionListener(this);
    		miSave.addActionListener(this);
    		miQuit.addActionListener(this);
    	}
    	
    	public void luceneIn(){
    		lab2=new JLabel("文件目录:");
    		lab2.setBounds(20,38,70,30);
    		field2=new JTextField(30);
    		field2.setBounds(90, 38, 120, 30);
    		jButton2=new JButton("...");
    		jButton2.setBounds(220,38,60,30);
    		lab1 = new JLabel("检索关键字:");
    		lab1.setBounds(310, 35, 90, 40);
    		field1=new JTextField("请输入检索关键字:",30);
    		field1.setBounds(400, 38, 200,30);
    		jButton1=new JButton("检索");
    		jButton1.setBounds(610,38,80,30);
    		topPane.add(lab1);
    		topPane.add(lab2);
    		topPane.add(field1);
    		topPane.add(field2);
    		topPane.add(jButton1);
    		topPane.add(jButton2);
    		jfc = new JFileChooser();
    		jfc.setCurrentDirectory(new File("d://"));// 文件选择器的初始目录定为d盘
    	}
    	
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		if (e.getActionCommand()=="...") {
    			jfc.setFileSelectionMode(1);// 设定只能选择到文件夹 
    			int state = jfc.showOpenDialog(null);// 此句是打开文件选择器界面的触发语句  
                if (state == 1) {  
                    return;
                } else {  
                    File f = jfc.getSelectedFile();// f为选择到的目录
                    field2.setText(f.getAbsolutePath());
                    try {
    					LuceneIndex.createIndex(f.getAbsolutePath());//打开目录时,开始创建lucene索引
    				} catch (Exception e1) {
    					e1.printStackTrace();
    					JOptionPane.showMessageDialog(null,"构建索引库异常!");
    				}
                }  
    		}else if (e.getActionCommand()=="检索") {
    			tArea.setText("");
    			String searchName= field1.getText();
    			try {
    				 Map<String, String> respContents= LuceneIndex.searchIndex(searchName);//查询索引
    				if (respContents.isEmpty()) {
    					tArea.setText("未检索到文本内容");
    				}else{
    					StringBuilder sb=new StringBuilder();
    					 Set<Map.Entry<String, String>> entryseSet=respContents.entrySet();
    					 sb.append("检索到的文件总数:"+respContents.size()+"\n");
    					 sb.append("-------------------------------------分隔符-------------------------------------------\n\n");
    					 for (Map.Entry<String, String> entry:entryseSet) {
    						sb.append("所属文件:"+entry.getKey()+"\n"+"文件内容:\n"+entry.getValue()+"\n");
    						sb.append("-------------------------------------分隔符-------------------------------------------\n\n");
    					}
    					tArea.setText(sb.toString());
    					Highlighter highLighter = tArea.getHighlighter();
    					String text=tArea.getText();
    					DefaultHighlighter.DefaultHighlightPainter p = new DefaultHighlighter.DefaultHighlightPainter(Color.RED);
    					int pos = 0;
    			        while ((pos = text.indexOf(searchName, pos)) >= 0){
    			            try {
    			                highLighter.addHighlight(pos, pos + searchName.length(), p);
    			                pos += searchName.length();
    			            }catch (BadLocationException e2) {
    			                e2.printStackTrace();
    			            }
    			        }
    				}
    			} catch (Exception e1) {
    				e1.printStackTrace();
    				JOptionPane.showMessageDialog(null,"检索异常!");
    			}
    		}else if (e.getActionCommand()=="字体与颜色(F)...") {
    			TestJComboBox frm=new TestJComboBox("字体选择");
    			frm.setVisible(true);
    		}else if (e.getActionCommand()=="新建(N)") {
    			tArea.setText("");
    		}else if (e.getActionCommand()=="退出(X)") {
    			if (tArea.getText().length()>0) {
    				int result = JOptionPane.showConfirmDialog(null, "是否保存当前编辑过的文件?", "是", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
    				if (result==JOptionPane.YES_OPTION) {
    					FileDialog fd = new FileDialog(this,"保存", FileDialog.SAVE);
    					writeTxtFile(fd);
    				}
    			}
    			this.dispose();
    		}else if(e.getActionCommand()=="打开(O)..."){
    			FileDialog open = new FileDialog(this, "打开文件", FileDialog.LOAD); 
    			open.setVisible(true); 
    			String filePath = open.getDirectory() + open.getFile();
    			if (filePath != null) {
    				String fileContent="";
    				 if (filePath.toLowerCase().endsWith("ppt") || filePath.toLowerCase().endsWith("pptx")) {
    					  try {
    						fileContent=PPTParse.pptParse(filePath);
    					} catch (Exception e1) {
    						e1.printStackTrace();
    					}
    				  }else if (filePath.toLowerCase().endsWith("xls") || filePath.toLowerCase().endsWith("xlsx")) {
    					fileContent=ExcelParse.parseFile(filePath);
    				 }else if (filePath.toLowerCase().endsWith("pdf")) {
    					fileContent=PDFParse.parsePDF(filePath);
    				 }else if (filePath.toLowerCase().endsWith("doc") || filePath.toLowerCase().endsWith("docx")) {
    					fileContent=WordParse.parseFile(filePath);
    				 }else{
    					 fileContent= readTxtFile(filePath);
    				 }
    				tArea.setText(fileContent);
    			} 
    		}else if(e.getActionCommand()=="保存(S)"){
    			FileDialog fd = new FileDialog(this,"保存", FileDialog.SAVE);
    			writeTxtFile(fd);
    		}
    	}
    	
    	public void writeTxtFile(FileDialog fd){
    		fd.setVisible(true);
    		try {
    			FileOutputStream out = new FileOutputStream(fd.getDirectory() + fd.getFile()+".txt");
    	        Object jtext;
    	        String str =tArea.getText();
    	        out.write(str.getBytes());
    	        out.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public String readTxtFile(String filePath){
            try {
                    String encoding="UTF-8";
                    StringBuffer sBuffer=new StringBuffer();
                    File file=new File(filePath);
                    if(file.isFile() && file.exists()){ //判断文件是否存在
                        InputStreamReader read = new InputStreamReader(
                        new FileInputStream(file),encoding);//考虑到编码格式
                        BufferedReader bufferedReader = new BufferedReader(read);
                        String lineTxt = null;
                        while((lineTxt = bufferedReader.readLine()) != null){
                            sBuffer.append(lineTxt+"\n");
                        }
                        read.close();
                        return sBuffer.toString();
            }else{
                System.out.println("找不到指定的文件");
            }
            } catch (Exception e) {
                System.out.println("读取文件内容出错");
                e.printStackTrace();
            }
            return "";
        }
    	
    	public static void main(String[] args) {
    		 LuceneJFrame lFrame= new LuceneJFrame("全文检索");
    	}
    }
    

    有问题可以私信或者在评论区留言。写作不易,既然来了,不妨点个关注,点个赞吧!!!

    展开全文
  • 主流方法是用中间件去访问,但是需要用JNI.Apache和微软合作,开发的POI,但是POI虽然功能强大,但是用起来也很麻烦用Java对word解析,抛弃使用中间件繁琐的方法,直接使用tm-extractor对word进行解析检索。...

    对于Javaword解析,主流方法是用中间件去访问,但是需要用JNI.

    Apache和微软合作,开发的POI,但是POI虽然功能强大,但是用起来也很麻烦

    Javaword解析,抛弃使用中间件繁琐的方法直接使用tm-extractor对word进行解析检索。

     

    tm-extractors0.4版本不需要apachepoi包,因为里面已经整合了

    tm-extractors1.0版本需要poi-3.0.1-FINAL-20070705.jar,版本一定要正确

    tm-extractors官方网站

    http://www.textmining.org/

    废话少说,直接上图和代码:

     

    package docSearch;

    import java.io.File;
    import java.util.ArrayList;

    public class FileSearch {
        public ArrayList<String> filelist = new ArrayList<String>();
       
     
        public void setFileList(String strPath) {
            File dir = new File(strPath);
            File[] files = dir.listFiles();
           
    //        SearchUI sui = new SearchUI();
    //        Boolean docselect = sui.getdocCheckBox();
    //        Boolean txtselect = sui.gettxtCheckBox();
    //        Boolean javaselect = sui.getjavaCheckBox();
              
            if (files == null)   
                return;   
            for (int i = 0; i < files.length; i++) {   
                if (files[i].isDirectory()) {   
                    setFileList(files[i].getAbsolutePath());   
                } else {   
                    String strFileName = files[i].getAbsolutePath().toLowerCase();
                    if((strFileName.endsWith(".doc"))&&
                      ((!files[i].getName().startsWith("~$"))||(!(files[i].length()<500)))){
                     //System.out.println("---"+strFileName+files[i].length());  
                        filelist.add(files[i].getAbsolutePath());
                    }
    //                else if(strFileName.endsWith(".java")){
    //                 filelist.add(files[i].getAbsolutePath());
    //                }
    //                else if(strFileName.endsWith(".txt")){
    //                 filelist.add(files[i].getAbsolutePath());
    //                }
                    else{
                     
                    }
                }
            }
        }
        public ArrayList<String> getFilePath(){

         return filelist;
        }

    }

    package docSearch;

    import java.io.File;
    import java.util.ArrayList;
    import java.util.StringTokenizer;

    public class FileScan {
     public ArrayList<String> keyWord = new ArrayList<String>();
     public ArrayList<String> FilePathList = new ArrayList<String>();
     
     
     public void setFilePathList(ArrayList<String> filePathList){
      this.FilePathList = filePathList;
     }
     
     public void setKeyWord(String Keyword){
    /*  StringTokenizer st = new StringTokenizer(Keyword);
          while (st.hasMoreTokens()) {
           keyWord.add(st.nextToken());
          }*/
      keyWord.add(Keyword);
     }
     
     /*
      */
     public Boolean scanFile(String fileText){

      String kw = null;
      int length = keyWord.size();
      for(int i=0;i<length;i++){
       kw = keyWord.get(i);
       //System.out.println(kw);
       //if(fileText.indexOf(kw)>=0)return true;
       if(FindSubString( fileText, kw)!=-1) return true;
      }
      return false;

     }
     
     public String getFileText(){

      String fileText = null;
      return fileText;
     }
     
     public int FindSubString(String fileText,String keyword){
      
      if ((fileText.equals("")) || (keyword.equals(""))){
       return -1;
      }
      int i = 0;
      int j = 0;
      int nLenMain = fileText.length();
      int nLenSub = keyword.length();

      if (nLenSub > nLenMain){
       return -1;
      }
      while ((i < nLenMain) && (j < nLenSub)){
       if (fileText.charAt(i) == keyword.charAt(j)){
        ++i;
        ++j;
       }
       else{
        i = i - j + 1;
        j = 0;
       }
      }
      if (j == nLenSub){
       return i - j;
      }
      else{
       return -1;
      }
     }
    }

    package docSearch;

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;

    import javax.swing.JOptionPane;

    import org.textmining.extraction.word.WordTextExtractor;
    import org.textmining.extraction.word.WordTextExtractorFactory;


    public class javaReadDoc {
     
     public ArrayList<String> failOpenList = new ArrayList<String>();   
     
     public String readDoc(String docpath){
      
      
      String text = null;
      
      if(docpath.endsWith(".doc")){   
       FileInputStream in = null;
       try {
        in = new FileInputStream(new File(docpath));
       } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        System.out.println("新建"+docpath+"文件数据流失败!");
        e.printStackTrace();
       }

       WordTextExtractorFactory extractor = new WordTextExtractorFactory();

       
       try {
        WordTextExtractor ex = (WordTextExtractor) extractor.textExtractor(in);
        text = ex.getText();
        //text = extractor.textExtractor(in).getText();
       } catch (IOException e) {
        // TODO Auto-generated catch block
        System.out.println("读入"+docpath+"文件失败!");
        e.printStackTrace();
       } catch (Exception e) {
        // TODO Auto-generated catch block
        //JOptionPane.showMessageDialog(null,"读取 "+docpath+" 文件失败!/n按确定跳过该文件,继续搜索。");
        failOpenList.add(docpath);
        //System.out.println(docpath+"文件操作失败!");
        return "的";
        //e.printStackTrace();
       }

       
      }
      else{
       try {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(docpath)));  
         String data = null;  
         while((data = br.readLine())!=null)  
         {  
          text=text+data; 
         }
        
       } catch (IOException e) {
        // TODO 自动生成 catch 块
        failOpenList.add(docpath);
        return "的";
       }
      }
      return text;

     }
     
     public ArrayList<String> getFailOpenFile(){
      return this.failOpenList;
      
     }

    }

    package docSearch;

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Toolkit;
    import java.awt.datatransfer.Clipboard;
    import java.awt.datatransfer.StringSelection;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Date;

    import javax.swing.*;


    public class SearchUI{
     
     private JButton file = new JButton("选择文件夹");
     private JLabel label = new JLabel(" 关键字:");
     private JTextField keyWord = new JTextField("",26);//在这里输入关键字,多个关键字用空格隔开
     private JCheckBox docFile = new JCheckBox(".doc");
     private JCheckBox javaFile = new JCheckBox(".java");
     private JCheckBox txtFile = new JCheckBox(".txt");
     private JPopupMenu   popup;
     private String jtabelFilePath= null;
     private final int JTabelColumnNum = 180;
     
     final Object[] columnNames = {"文件名", "文件路径", "文件大小","修改日期"};
     Object[][] rowData = new Object[JTabelColumnNum][4];
     private JTable FileList = new JTable (rowData,columnNames);
     private int choiceRow = -1;

     
     public void showUI(){
      
      popup = new JPopupMenu();  
      FileList.setPreferredScrollableViewportSize(new Dimension(600, 100));//设置表格的大小
      FileList.setRowHeight (16);//设置每行的高度
      FileList.setSelectionForeground (Color.red);//设置所选择行的前景色
      FileList.doLayout ();
      FileList.setComponentPopupMenu(popup);
      FileList.getColumnModel().getColumn(1).setPreferredWidth(250); //设置列宽

      JScrollPane pane = new JScrollPane (FileList);
      JPanel p = new JPanel (new FlowLayout (6));

      p.add(label);
      p.add(keyWord);
      //p.add(docFile);
      //p.add(txtFile);
      //p.add(javaFile);
      p.add(file);
      
      JSeparator seph = new JSeparator();
      
      JPanel panel = new JPanel (new BorderLayout());
      panel.setPreferredSize (new Dimension (750,450));
      panel.add(seph,BorderLayout.NORTH);
      panel.add (pane,BorderLayout.CENTER);

      JFrame frame = new JFrame ("文档搜索");
      frame.setSize(750,450);
      frame.setVisible(true);
      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

      Container con = frame.getContentPane();
      con.setLayout(new BorderLayout());
      con.add(p,BorderLayout.NORTH);
      con.add(panel,BorderLayout.CENTER);

      frame.pack();
      
      
      file.addActionListener(new ActionListener(){

       public void actionPerformed(ActionEvent arg0) {
        // TODO 自动生成方法存根
        ClearTabel();
        String KeyWord = keyWord.getText();
        FileScan scanfile = new FileScan();
        scanfile.setKeyWord(KeyWord);
        
        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        JFrame fr = new JFrame ();
        int returnVal = chooser.showOpenDialog(fr);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
         
         FileSearch fs = new FileSearch();
         String strPath = chooser.getSelectedFile().toString();
         fs.setFileList(strPath);
         
         //JOptionPane.showMessageDialog(null,"fs.setFileList(strPath);。");
         
         int size = fs.getFilePath().size();
         int ff = 0;
         javaReadDoc jdocreader = new javaReadDoc();
         
         for(int i=0;i<size;i++){
          
          String docpath = fs.getFilePath().get(i);
          String Text= null;
          
          
          Text = jdocreader.readDoc(docpath);

          
          if(scanfile.scanFile(Text)){
           
           ShowFileList(docpath,ff);
           ff++;
          }           
         }
         //JOptionPane.showMessageDialog(null,"fs.setFileList;。");
         
         ArrayList<String> failOpenList = jdocreader.getFailOpenFile();
         int fofSize = failOpenList.size();
         if(fofSize>0){
          ff++;
          for(int num=0;num<fofSize;num++){
           ff++;
           ShowFileList(failOpenList.get(num),ff);
          }
          ff=ff-fofSize-1;
          JOptionPane.showMessageDialog(null,"搜索完毕!共搜到" +ff+" 个结果。/n其中列表最后"+ fofSize +"个文件未能扫描");
         }
         else JOptionPane.showMessageDialog(null,"搜索完毕!共搜到" +ff+" 个结果。");
        }   
       }  
      });
      
      FileList.addMouseListener(new MouseAdapter() {
       public void mouseClicked(MouseEvent me) {
        if (me.getClickCount()==1) {
         choiceRow = FileList.getSelectedRow();
         jtabelFilePath = (String) FileList.getValueAt(choiceRow, 1);     
        }
       }
      });
      
      Action openRoomAction = new AbstractAction()
      {
       public void actionPerformed(ActionEvent actionEvent)
       {
        if (jtabelFilePath.equals(null)){
        }
        else{
         
        }
       }
      };

      openRoomAction.putValue(Action.NAME, "所在文件夹");
      //popup.add(openRoomAction);
      
      Action openfileAction = new AbstractAction()
      {
       public void actionPerformed(ActionEvent actionEvent)
       {
        if (jtabelFilePath.equals("")){
        }
        else{
         try {
          Runtime.getRuntime().exec("C://Program Files//Microsoft Office//OFFICE11//WINWORD.EXE    "+jtabelFilePath);
          } catch (IOException e) {
          JOptionPane.showMessageDialog(null,"打开文件时出错!");
          //System.out.println("打开文件出错!");
          e.printStackTrace();
         }
        }
       }
      };
      
      openfileAction.putValue(Action.NAME, "打开文件");
      popup.add(openfileAction);
      
      Action copyFilePath = new AbstractAction()
      {
       public void actionPerformed(ActionEvent actionEvent)
       {
        if (jtabelFilePath.equals("")){
        }
        
        else{
         Clipboard clipboard=Toolkit.getDefaultToolkit().getSystemClipboard(); //获得系统剪贴板
         StringSelection contents=new StringSelection(jtabelFilePath); //用拷贝文本框文本实例化StringSelection对象
         clipboard.setContents(contents, null); //设置系统剪贴板内容
        }
       }
      };
      copyFilePath.putValue(Action.NAME, "复制路径");
      popup.add(copyFilePath);

     
      Action delfileAction = new AbstractAction()
      {
       public void actionPerformed(ActionEvent actionEvent)
       {
        if (jtabelFilePath.equals("")){
        }
        
        else{
         FileTools fileTools = new FileTools();
         if(fileTools.delFile(jtabelFilePath)){
          FileList.setValueAt(null, choiceRow, 0);
          FileList.setValueAt(null, choiceRow, 1);
          FileList.setValueAt(null, choiceRow, 2);
          FileList.setValueAt(null, choiceRow, 3);
         }
         
        }
       }
      };
      delfileAction.putValue(Action.NAME, "删除文件");
      popup.add(delfileAction);
     }


     
     public static void main(String args[]){
      new SearchUI().showUI();
     }
     
     public void ShowFileList(String strPath,int row){
      java.io.File myFile = new java.io.File(strPath);
      FileList.setValueAt(myFile.getName(), row, 0);
      FileList.setValueAt(myFile.getPath(), row, 1);
      FileList.setValueAt(myFile.length()+" B", row, 2);
      java.util.Date dt = new Date(myFile.lastModified());
      FileList.setValueAt(dt.toLocaleString(), row, 3);
     }
     
     public void ClearTabel(){
      for (int i=0;i<JTabelColumnNum;i++){
       FileList.setValueAt(null, i, 0);
       FileList.setValueAt(null, i, 1);
       FileList.setValueAt(null, i, 2);
       FileList.setValueAt(null, i, 3);
      }
     }
     
     public Boolean getdocCheckBox(){
      return docFile.isSelected();
     }
     
     public Boolean gettxtCheckBox(){
      return txtFile.isSelected();
     }
     
     public Boolean getjavaCheckBox(){
      return javaFile.isSelected();
     }
     
    }

    展开全文
  • 用C#动态生成Word文档功能实现了,在本地的机器运行时是好的,但安装到远程服务器上就报错了,让我头疼了好久,看了很多的信息后,现在才算是搞定了。 为了不忘记特意再此做下记录来!程序安装到远程服务器上,首先...

    用C#动态生成Word文档功能实现了,在本地的机器运行时是好的,但安装到远程服务器上就报错了,让我头疼了好久,看了很多的信息后,现在才算是搞定了。 为了不忘记特意再此做下记录来!

    程序安装到远程服务器上,首先报的错误代码就是80070005(检索COM类工厂中CLSID为{000209FF-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005)

    关于这个问题,MSDN上是这样说的

    以交互式用户身份配置 Office

    <script type="text/javascript">loadTOCNode(3, 'moreinformation');</script> 要在交互式用户帐户下设置 Office 自动化服务器,请按照下列步骤操作:

    1. 以管理员身份登录到计算机,并使用完整安装来安装(或重新安装)Office。为了实现系统的可靠性,建议您将 Office CD-ROM 中的内容复制到本地驱动器并从此位置安装 Office。
    2. 启动要自动运行的 Office 应用程序。这会强制该应用程序进行自我注册。
    3. 运行该应用程序后,请按 Alt+F11 以加载 Microsoft Visual Basic for Applications (VBA) 编辑器。这会强制 VBA 进行初始化。
    4. 关闭应用程序,包括 VBA。
    5. 单击开始,单击运行,然后键入 DCOMCNFG。选择要自动运行的应用程序。应用程序名称如下所示:
    Microsoft Access 97 - Microsoft Access 数据库
    Microsoft Access 2000/2002 - Microsoft Access 应用程序
    Microsoft Excel 97/2000/2002 - Microsoft Excel 应用程序
    Microsoft Word 97 - Microsoft Word Basic
    Microsoft Word 2000/2002 - Microsoft Word 文档
    单击属性打开此应用程序的属性对话框。

    6. 单击安全选项卡。验证使用默认的访问权限使用默认的启动权限已选中。
    7. 单击标识选项卡,然后选择交互式用户
    8. 单击确定,关闭属性对话框并返回主应用程序列表对话框。
    9. DCOM 配置对话框中,单击默认安全性选项卡。
    10. 单击访问权限的编辑默认值。验证访问权限中是否列出下列用户,如果没有列出,则添加这些用户:
    SYSTEM
    INTERACTIVE
    Everyone
    Administrators
    IUSR_<machinename>*
    IWAM_<machinename>*

    * 这些帐户仅在计算机上安装了 Internet Information Server (IIS) 的情况下才存在。
    11. 确保允许每个用户访问,然后单击确定
    12. 单击启动权限的编辑默认值。验证启动权限中是否列出下列用户,如果没有列出,则添加这些用户:
    SYSTEM
    INTERACTIVE
    Everyone
    Administrators
    IUSR_<machinename>*
    IWAM_<machinename>*

    * 这些帐户仅在计算机上安装有 IIS 的情况下才存在。
    13. 确保允许每个用户访问,然后单击确定
    14. 单击确定关闭 DCOMCNFG。
    15. 启动 REGEDIT,然后验证对于要自动运行的 Office 应用程序,是否存在下列注册表项和字符串值:
    Microsoft Access 2000/2002:
    注册表项:HKEY_CLASSES_ROOT/AppID/MSACCESS.EXE
    AppID:{73A4C9C1-D68D-11D0-98BF-00A0C90DC8D9}

    Microsoft Access 97:
    注册表项:HKEY_CLASSES_ROOT/AppID/MSACCESS.EXE
    AppID:{8CC49940-3146-11CF-97A1-00AA00424A9F}

    Microsoft Excel 97/2000/2002:
    注册表项:HKEY_CLASSES_ROOT/AppID/EXCEL.EXE
    AppID:{00020812-0000-0000-C000-000000000046}

    Microsoft Word 97/2000/2002:
    注册表项:HKEY_CLASSES_ROOT/AppID/WINWORD.EXE
    AppID:{00020906-0000-0000-C000-000000000046}

    如果这些注册表项不存在,则可以通过在系统中运行以下 .reg 文件来创建它们:
    REGEDIT4
    
    [HKEY_CLASSES_ROOT/AppID/WINWORD.EXE]
    "AppID"="{00020906-0000-0000-C000-000000000046}"
    
    [HKEY_CLASSES_ROOT/AppID/EXCEL.EXE]
    "AppID"="{00020812-0000-0000-C000-000000000046}"
    
    [HKEY_CLASSES_ROOT/AppID/MSACCESS.EXE]
    "AppID"="{73A4C9C1-D68D-11D0-98BF-00A0C90DC8D9}"
    					
    注意:该示例 .reg 文件是针对 Access 2000 或 Access 2002 的。如果您使用的是 Access 97,请将 AppID 项更改为:
    "AppID"="{8CC49940-3146-11CF-97A1-00AA00424A9F}"
    16. 重新启动系统。这是必需的。

    参考:http://support.microsoft.com/kb/288366/zh-cn

     

    展开全文
  • 想制作一个像help一样的文档,可以把各种word文档系统的规整在一起,并实现对文档的快速检索功能。现在用help and manaual 制作了cmh文档,虽然能够有目录,索引和超链接,但是,无法实现搜索,在搜索处输入文字,都...
  •  若要获得 Microsoft Excel 中的 VBA 过程的列表的工作簿、 一个 PowerPoint 演示文稿或 Word 文档,您可以使用类和函数公开结合的应用程序对象模型的应用程序扩展库通过 Microsoft vba。当利用自动化功能...
  • 最近在做一个网站时,有一个下载word文档功能,在本地直接调试是可以下载的,但部署到IIS上就出现问题了。 出现问题如下:Error:下载简历方法出错:检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-...
  • oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...
  • unioffice是用于创建Office Open XML文档(.docx,.xlsx和.pptx)的库。 它的目标是成为用于创建和编辑docx / xlsx / pptx文件的最兼容,性能最高的Go库。 状态 文件(docx)[Word] 读/写/编辑 格式化 图片 桌子 ...
  • Oracle全文检索

    2017-11-16 16:49:01
    Oracle(oracle text):Oracle Text使Oracle9i具备了强大的文本检索能力和智能化的文本管理能力,它可以对存储于文件系统中的文档进行检索和查找,并可检索超过 150 种文档类型,包括 Microsoft Word、PDF和XML。...
  • 全文检索工具Lucene入门教程

    千次阅读 多人点赞 2020-07-11 17:55:11
    Apache Lucene是完全用Java编写的高性能,功能齐全的,全文检索引擎工具包,通过lucene可以让程序员快速开发一个全文检索功能。 1.1什么是全文检索 在我们的生活中数据总体分为两种:结构化数据 和非结构化数据 。...
  • 1.1 常见的全文检索  1) 在window系统中,可以指定磁盘中的某一个位置来搜索你想要得到的东西。 2) 在myeclipse中,点击Help->Help Contents,可以利用搜索功能找到你要查询的帮助文档。 3) 在百度和google 中,可以...
  • Oracle全文检索.rar

    2019-07-09 08:15:42
    它可以对存储于文件系统中的文档进行检索和查找,并可检索超过150 种文档类型,包括Microsoft Word、PDF 和XML。Oracle Text 查找功能包括模糊查找、词干查找(搜索mice和查找mouse)、通配符、相近性等查找方式,...
  • 就像在word中进行搜索时,会在目录中高亮显示在那些节有检索词,并返回共有多少个匹配项。 就是需要先定位到文档,然后还要定位到文档中的位置信息。 用lucene的话怎么实现这种功能? 举个例子: 我想...
  • java文档在线预览实现

    万次阅读 热门讨论 2016-10-21 09:39:07
    Java文档在线预览实现近期因需要完成对word、excel、ppt、txt等文档的内容检索,在用户检索到相关内容时,需要给用户提供一个在线预览文档功能。在网上找到部分参考后,实现了该功能。Java文档在线预览实现 主要...
  • 首先,在使用office相关组件及功能时,需要装office。 1、点击Win +R键输入comexp.msc -32(如果按钮的Word是64位的输入dcomcnfg)回车;(或者 开始→设置→控制面版→管理...Microsoft Word 97 - 2003 文档"...
  • 关于Word软件中有许多实用的小技巧、小功能,使得我们大家操作时更加方便快捷,在我们使用word文档录入文字内容时,录入多些内容章节时我们可以使用页码来标记每一页面次序的号码或者数字,用以统计书籍的面书,便于...
  • 优质个人文档管理系统. 文档管理: 文档检索: 文件夹加密: 文件夹目录调整: 文档目录调整: 附件管理: 标题检测: 与Word的导入导出: 自动同步: 等功能要点..
  • 本例使用了lucene6.4.0与lire,可对各文档(word...ImageCreatIndex、ImageSearch分别建立图片索引与检索功能,为以图搜图实例 ; Txt2Serach、TxtSerach为文档及图片中文字检索,一个为标准分词器,另一个用中文分词器。
  • gensim 之 word2vec

    千次阅读 2017-06-28 18:19:40
    gensim库三大功能: ...检索语义上类似的文档 word2vec是gensim的一个子模块,可以用来实现上面三大功能word2vec的理解下面的两篇博客对word2vec介绍的很详细 https://www.zhihu.com/question/25269336 ...
  • 类型:应用扩展 功能:检索 描述:TextSearcher组件提供强大的全文检索功能;TextSearcher组件是知识管理的利器,支持多种常用文档格式,包括:Word,Excel,P
  • Filefilter 简介:本版本为最新试用版,文件限制个数为100,增加了结果排序功能、忽略大小写模糊查找功能,使用此工具可以根据输入的关键词(以逗号分开),在word文档中匹配筛选关键词,并给出关键词匹配查找到的...
  • 自然语言处理word2vec

    2018-07-20 14:12:05
    检索语义上类似的文档 word2vec是gensim的一个子模块,可以用来实现上面三大功能。而CBOW模型和 Skip-Gram模型是word2vec的两个模型。   Genism: 在gensim中,word2vec相关的API都在gensim.models...
  • 用C#动态生成Word文档功能实现了,在本地的机器运行时是好的,但安装到远程服务器上就报错了,让我头疼了好久,看了很多的信息后,现在才算是搞定了。 为了不忘记特意再此做下记录来! 程序安装到远程服务器上,...
  • Apache Lucene 是完全用Java编写的高性能,功能齐全的,全文检索引擎工具包,通过lucene可以让程序员快速开发一个全文检索功能。 1.1什么是全文检索 在我们的生活中数据总体分为两种:结构化数据和非结构化...
  • “CHM 制作精灵”是一款将网页文件(Html文档)转化为...快速:制作一个300页的Word文档大约只需要10分钟(在PIII733/256M内存环境下); 方便:用户只需维护一份Word格式的文档,随时可以快速生成美观实用的CHM文档。

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 200
精华内容 80
关键字:

word文档检索功能