Lucene之完整搜索实例

1、创建索引器:

package yushibujue;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

import tool.FileList;
import tool.FileText;

public class LuceneIndexer {

	 private JTextField jtfa;
	 private JButton jba;
	 private JTextField jtfb;
	 private JButton jbb;
	 private JButton jbc;
	 private static JTextArea jta;

	 //索引器外观类
	 private void createAndShowGUI(){
		 //设置跨平台外观感觉
		 String lf=UIManager.getCrossPlatformLookAndFeelClassName();

		 //GTK外观感觉
		 //String lf="com.sun.java.swing.plaf.gtk.GTKLookAndFeel";

		 //Sysetm外观感觉
		// String lf=UIManager.getSystemLookAndFeelClassName();

		 //windows外观感觉
		// String lf="com.sun.java.swing.plaf.WindowsLookAndFeel";

		 //Metal外观感觉
		 //String lf="javax.swing.plaf.metal.MetalLookAndFeel";

		 //common use
		 try{

			 UIManager.setLookAndFeel(lf);

		 }catch(Exception e){
			 JOptionPane.showMessageDialog(null,"无法设定外观感觉!");
		 }

		 //java  感觉
		 JFrame.setDefaultLookAndFeelDecorated(true);
		 JFrame frame=new JFrame("YUSHIBUJUE");
		 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		 final JFileChooser fc=new JFileChooser();
		 fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

		 Container con=frame.getContentPane();
		 con.setLayout(new BorderLayout());

		 JPanel jpup=new JPanel();
		 jpup.setLayout(new GridLayout(3,2));
		 jtfa=new JTextField(30);
		 jba=new JButton("选择被索引的文件存放路径");
		 jba.addActionListener(
		      new ActionListener(){
		    	  public void actionPerformed(ActionEvent e){
		    		  int r=fc.showOpenDialog(null);
		    		  if(r==JFileChooser.APPROVE_OPTION){
		    			  jtfa.setText(fc.getSelectedFile().getPath());
		    			  jbc.setEnabled(true);
		    		  }
		    	  }
		      }
		 );

		 jtfb=new JTextField(30);
		 JButton jbb=new JButton("选择索引的存放路径");
		 jbb.addActionListener(
		    new ActionListener(){
		    	public void actionPerformed(ActionEvent e){
		    		int r= fc.showOpenDialog(null);
		    		if(r==JFileChooser.APPROVE_OPTION){
		    			jtfb.setText(fc.getSelectedFile().getPath());
		    			jbc.setEnabled(true);
		    		}
		    	}

		    }

		 );

		 JLabel jl=new JLabel("");
		 jbc=new JButton("建立索引");
		 jbc.addActionListener(
		    new ActionListener(){

		    	public void actionPerformed(ActionEvent e){
		    		try{
		    			LuceneIndeerTool.index(jtfa.getText(),jtfb.getText());
		    			//jbc.setEnabled(false);
		    		}catch(Exception ee){
		    			ee.printStackTrace();
		    			jbc.setEnabled(true);
		    			JOptionPane.showMessageDialog(null, "索引创建失败!");
		    			System.out.println(ee.getMessage());
		    		}
		    	}
		    }

		 );
		 jpup.add(jtfa);
		 jpup.add(jba);
		 jpup.add(jtfb);
		 jpup.add(jbb);
		 jpup.add(jl);
		 jpup.add(jbc);

		 jta=new JTextArea(10,60);
		 JScrollPane jsp=new JScrollPane(jta);
		 con.add(jpup,BorderLayout.NORTH);
		 con.add(jsp,BorderLayout.CENTER);

		 frame.setSize(200,100);
		 frame.pack();
		 frame.setVisible(true);

	 }

	 public static void main(String[] args) {
		SwingUtilities.invokeLater(
		    new Runnable(){

		    	public void run(){
		    		try{
		    			new LuceneIndexer().createAndShowGUI();
		    		}catch(Exception e){
		    			JOptionPane.showMessageDialog(null, "程序加载失败!");
		    		}
		    	}
		    }

		);
	}

	//使用内部类LuceneIndexerTool来实现索引工作,这样就可以把索引建立的情况反映在文本框里面了

	 static class LuceneIndeerTool{
		//创建索引,被索引的文件的路径,索引的路径
		 public static void index(String filesPath,String indexPath)throws IOException{

			 //建立索引器,我采用lucene4.7写法

			   File path=new File(indexPath);
			  SimpleFSDirectory indexDir=new SimpleFSDirectory(path);//读取被索引的文件目录
			  CJKAnalyzer analyzer=new CJKAnalyzer(Version.LUCENE_47);//创建一个二分法分析器
			  IndexWriterConfig conf=new IndexWriterConfig(Version.LUCENE_47, analyzer);
			  IndexWriter writer=new IndexWriter(indexDir,conf);

			/* Directory dir=FSDirectory.open(new File(indexPath));
			 Analyzer analyzer=new StandardAnalyzer();
			 IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_4_10_2,analyzer);
			 IndexWriter writer=new IndexWriter(dir,config);*/

			 //递归遍历文件目录来建立索引
			 String s[]=FileList.getFiles(filesPath);
			 int len=s.length;
			 for(int i=0;i<len;i++){
				 File f=new File(s[i]);
				 String ext=getExt(f);//获取扩展名
				 if(ext.equalsIgnoreCase("htm")||ext.equalsIgnoreCase("html")){
					 Document doc=new Document();

					 //filename field
					 String filename=f.getName();
					 Field field=new Field("filename",filename,Field.Store.YES,Field.Index.ANALYZED);
					 doc.add(field);

					 //uri field
					 String uri=f.getPath();
					 field=new Field("uri",uri,Field.Store.YES,Field.Index.NO);
					 doc.add(field);

					 //cdate field
					 Date dt=new Date(f.lastModified());
					 SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd E");
					 String cdate=sdf.format(dt);
					 field=new Field("cdate",cdate,Field.Store.YES,Field.Index.NO);
					 doc.add(field);

					 //size field
					 double si=f.length();
					 String size="";

					 if(si>1024){
						 size=String.valueOf(Math.floor(si/1024)+"K");
					 }else{
						 size=String.valueOf(si)+"Bytes";

					 }
					 field=new Field("size",size,Field.Store.YES,Field.Index.NO);
					 doc.add(field);

					 //text field
					 String text=FileText.getText(f);
					 field=new Field("text",text,Field.Store.YES,Field.Index.ANALYZED);
					 doc.add(field);

					 //digest field
					 String digest="";
					 if(text.length()>200){
						 digest=text.substring(0, 200);

					 }else{
						 digest=text;
					 }

					 field=new Field("digest",digest,Field.Store.YES,Field.Index.ANALYZED);
				     doc.add(field);

				     //归入索引
				     writer.addDocument(doc);
				     jta.setText(jta.getText()+"已经归入索引: " +f+"\n");
				 }

			 }
			 //关闭索引器
			 writer.close();
			 JOptionPane.showMessageDialog(null, "索引建立完毕!","提示", JOptionPane.INFORMATION_MESSAGE);

		 }

		 public static String getExt(File f){
			 String s=f.getName();
			 try{
				 s=s.substring(s.lastIndexOf(".")+1);

			 }catch(Exception e){
				 s="";
			 }
			 return s;

		 }

	 }

}

2、创建搜索器:

package yushibujue;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;

public class LuceneSearcher {
   private JTextField jtfa;
   private JButton jba;
   private JTextField jtfb;
   private JButton jbb;
   private JButton jbc;
   private static JTextArea jta;
   private JTextField jtfc;
   private JButton jbd;
   private JButton jbe;

   private void createAndShowGUI(){

	   //设置跨平台外观感觉
		 String lf=UIManager.getCrossPlatformLookAndFeelClassName();

		 //GTK外观感觉
		 //String lf="com.sun.java.swing.plaf.gtk.GTKLookAndFeel";

		 //Sysetm外观感觉
		// String lf=UIManager.getSystemLookAndFeelClassName();

		 //windows外观感觉
		// String lf="com.sun.java.swing.plaf.WindowsLookAndFeel";

		 //Metal外观感觉
		 //String lf="javax.swing.plaf.metal.MetalLookAndFeel";

		 //common use
		 try{
			 UIManager.setLookAndFeel(lf);
		 }catch(Exception ce){
			 JOptionPane.showMessageDialog(null, "无法设定外观感觉!");

		 }

		 //java feel
		 //java  感觉
		 JFrame.setDefaultLookAndFeelDecorated(true);
		 JFrame frame=new JFrame("YUSHIBUJUE");
		 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		 final JFileChooser fc=new JFileChooser();
		 fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

		 Container con=frame.getContentPane();
		 con.setLayout(new BorderLayout());

		 JPanel jpup=new JPanel();
		 jpup.setLayout(new GridLayout(2,2));
		 jtfa=new JTextField(30);
		 jba=new JButton("选择索引的存放路径");
		 jba.addActionListener(
			      new ActionListener(){
			    	  public void actionPerformed(ActionEvent e){
			    		  int r=fc.showOpenDialog(null);
			    		  if(r==JFileChooser.APPROVE_OPTION){
			    			  jtfa.setText(fc.getSelectedFile().getPath());
			    		  }
			    	  }
			      }
			    );
		 jtfb=new JTextField(30);
		 JButton jbb=new JButton("搜索");
		 jbb.addActionListener(
				    new ActionListener(){
				    	public void actionPerformed(ActionEvent e){
				    		 try{
				    			 String indexPath=jtfa.getText();
				    			 String phrase=jtfb.getText();
				    			 new LuceneSearcherTool().search(phrase,indexPath);
				    		 }catch(Exception ex){
				    			 JOptionPane.showMessageDialog(null, "搜索失败","提示",JOptionPane.ERROR_MESSAGE);
				    		 }
				    	}
				    }
				  );
		 jpup.add(jtfa);
		 jpup.add(jba);
		 jpup.add(jtfb);
		 jpup.add(jbb);

		 jta=new JTextArea(10,30);
		 JScrollPane jsp=new JScrollPane(jta);

		 JPanel jpdown=new JPanel();
		 jpdown.setLayout(new FlowLayout());
		 jtfc=new JTextField(35);
		 jbd=new JButton("设定导出路径");
		 fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
		 jbd.addActionListener(new ActionListener(){

			 public void actionPerformed(ActionEvent e){
				 int r=fc.showOpenDialog(null);
				 if(r==JFileChooser.APPROVE_OPTION){
					 jtfc.setText(fc.getSelectedFile().getPath());
				 }
			 }

		 });

		 jbe=new JButton("导出搜索结果");
		 jbe.addActionListener(
			 new ActionListener(){
				 public void actionPerformed(ActionEvent e){
					 try{
						 File f=new File(jtfc.getText());
						 FileWriter fw=new FileWriter(f);
						 PrintWriter pw=new PrintWriter(fw);
						 pw.write(jta.getText());
						 pw.flush();
						 pw.close();
						 JOptionPane.showMessageDialog(null, "写入文件成功!","提示",JOptionPane.INFORMATION_MESSAGE);
				       }catch(IOException ioe){
						     JOptionPane.showMessageDialog(null, "写入文件失败!","提示",JOptionPane.ERROR_MESSAGE);
					   }
			    }
			 }

         );

		 jpdown.add(jtfc);
		 jpdown.add(jbd);
		 jpdown.add(jbe);

		 con.add(jpup,BorderLayout.NORTH);
		 con.add(jsp,BorderLayout.CENTER);
		 con.add(jpdown,BorderLayout.SOUTH);

		 frame.setSize(200,100);
		 frame.pack();
		 frame.setVisible(true); 

   }

   public static void main(String[] args){
	   SwingUtilities.invokeLater(new Runnable(){

		   public void run(){

			   new LuceneSearcher().createAndShowGUI();
		   }

	   });
   }

   static class LuceneSearcherTool{
	   //执行搜索--搜索关键词、索引的路径
	   public static void search(String phrase,String indexPath)throws IOException{
		   //建立索引器
		   IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(FSDirectory.open(new File(indexPath))));

		   //搜索text字段
		   Term t=new Term("text",phrase);

		   //生成Query对象
		   TermQuery query=new TermQuery(t);
		   TopDocs topDocs=searcher.search(query,20);

		   ScoreDoc[] scoreDocs=topDocs.scoreDocs;
		   jta.setText("检索到的记录数量:"+topDocs.totalHits+"\n");
		   jta.setText(jta.getText()+"*******************"+"\n\n");
		   System.out.println("查询结果总数:"+topDocs.totalHits+"最大的评分:"+topDocs.getMaxScore());
		   for(int i=0;i<scoreDocs.length;i++){
			   int doc=scoreDocs[i].doc;
			   Document document = searcher.doc(doc);
			   if(document==null){
				   continue;
			   }

			   //获得filename字段,此处采用了强制转换(try)
			   Field field=(Field) document.getField("filename");
			   String filename=field.stringValue();

			   //uri字段
			   field=(Field) document.getField("uri");
			   String uri=field.stringValue();

			   //cdate字段
			   field=(Field) document.getField("cdate");
			   String cdate =field.stringValue();

			   //digest 字段
			   field=(Field) document.getField("digest");
			   String digest=field.stringValue();

			   StringBuffer sb=new StringBuffer();
			   sb.append("URI:"+uri+"\n");
			   sb.append("filename:"+filename+"\n");
			   sb.append("cdate:"+cdate+"\n");
			   sb.append("digest:"+digest+"\n");
			   sb.append("-------------------"+"\n");

			   jta.setText(jta.getText()+sb.toString());

			  /* System.out.println("content:"+document.get("content"));
			   System.out.println("id:" + scoreDocs[i].doc + "   scors:" + scoreDocs[i].score+"---index--"+scoreDocs[i].shardIndex);
			   */
		   }

	   }
   }

}

效果图:

索引器:

搜索器:

时间: 2024-10-16 10:22:21

Lucene之完整搜索实例的相关文章

Apache Solr采用Java开发、基于Lucene的全文搜索服务器

http://docs.spring.io/spring-data/solr/ 首先介绍一下solr: Apache Solr (读音: SOLer) 是一个开源.高性能.采用Java开发.基于Lucene的全文搜索服务器,文档通过Http利用XML加到一个搜索集合中,查询该集合也是通过 http收到一个XML/JSON响应来实现.Solr 中存储的资源是以 Document 为对象进行存储的.每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性.Solr 中的每个 Doc

Lucene及全文搜索实现原理

Lucene及全文搜索实现原理 全文搜索 全文搜索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式.这个过程类似于通过字典中的检索字表查字的过程.全文搜索搜索引擎数据库中的数据. ????全文搜索的过程主要分为两个部分,索引的建立以及索引的搜索. 国内外的全文搜索常用的检索模型主要有向量模型,布尔模型等. 布尔模型 布尔模型是第一个信息检索的模型,可能也是最

文件上传插件Uploadify在Struts2中的应用,完整详细实例

->最近由于项目需要使用到一个上传插件,在网上发现uploadify挺不错,所以决定使用它,但是官网文档和例子是php的,而项目是SSI框架的,所以自己对uploadify在struts2中的使用进行了一番研究,最终实现了.发现网上关于这方面的资料很少,而且有的一两篇例子还不大全,网友提问质疑很多,所以,下面我特将我的代码公布: --------------------------------------------------------------------- 步骤一: 到官网上下载upl

ElasticSearch搜索实例含高亮显示及搜索的特殊字符过滤

应用说明见代码注解. 1.简单搜索实例展示: public void search() throws IOException {        // 自定义集群结点名称        String clusterName = "elasticsearch_pudongping"; // 获取客户端        Client client = ESClient.initClient(clusterName); // 创建查询索引,参数productindex表示要查询的索引库为prod

e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (四) Q 反回调

上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServer数据库的访问” 下面讲一下,对于在写Node.js自动化测试脚本过程中,的编写回调问题, 大家可能会发现, Node.js对于高并发处理的性能非常不错, 即使是在使用单核的情况下, 那是因为它是基于事情,说白了就是callback, 回调. 这样的话,对于写代码的人来说, 回调的深度一深就会晕了

Notification完整使用实例

MainActivity如下: package cc.cv; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; import android.app.Notification; import android.app.Notification.B

完整软件实例中文编程解析,软件试用版注册版编程思路视频教程

通过对完整软件实例(工程设计流水管理系统)编程讲解,让学员熟悉完整软件布局架构及开发思路.比如从界面布局.登录验证.软件注册程序.到软件发布等知识点,贯穿知识点间联系,提升编程整合能力. 中文编程完整软件实例编程解析之工程设计流水管理系统(8课时) 第1课:整体布局.EXCEL表数据导入到软件数据库编程a.整体布局b.EXCEL表数据导入到软件数据库编程第2课:基本信息预先设置编程a.项目名称预设置 第3课:子项目工程日志流水编程解析a.工程日志流水编程 第4课:子项目设计费发放流水编程解析a.

Spring mvc整合mybatis基于mysql数据库实现用户增删改查及其分页显示的完整入门实例【转】

Spring mvc整合mybatis例子, 基于mysql数据库实现对用户的增.删.改.查,及分页显示的完整例子. 查询显示用户 添加用户 更新用户 官方验证: 项目截图 必须修改applicationContext.xml中mysql的配置为本地的,否则启动失败. 另外jar包多一个ehcache.jar无关紧要,删除即可. 1. 使用阿里巴巴Druid连接池(高效.功能强大.可扩展性好的数据库连接池.监控数据库访问性能.支持Common-Logging.Log4j和JdkLog,监控数据库

lucene的suggest(搜索提示功能的实现)

1.首先引入依赖 <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-suggest --> <!-- 搜索提示 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-suggest</artifactId> <version>7.2.1<