浏览 5618 次
锁定老帖子 主题:Lucene3.6实现全文检索的小例子
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-02-21
lucene-analyzers-3.6.1.jar lucene-core-3.6.1.jar lucene-highlighter-3.6.1.jar (高亮效果) 首先,将需要检索的数据用内定的方式创建索引,(这里创建索引保存在硬盘) 1、新建一个config.properties #路径 indexPath=C:/lucene-doc 2、建一个Configuration类: import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class Configuration { //采用单例模式 private static final Configuration configuration = new Configuration(); private Configuration(){} public synchronized static Configuration getInstance(){ return configuration; } public String read(String properties,String key){ //读取配置文件 InputStream in = this.getClass().getClassLoader().getResourceAsStream(properties); Properties p = new Properties(); try { p.load(in); } catch (IOException e) { e.printStackTrace(); } //取得配置文件中的值 return p.getProperty(key); } } 3、创建索引: /** * 创建索引 */ public String createSearch() throws Exception { System.out.println("开始创建索引。。。"); long stime = new Date().getTime(); String indexPath = Configuration.getInstance().read("config.properties", "indexPath"); Directory dir = FSDirectory.open(new File(indexPath)); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36); IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_36, analyzer); iwc.setOpenMode(OpenMode.CREATE); //即创建新索引文件OpenMode.CREATE_OR_APPEND表示创建或追加到已有索引文件 IndexWriter writer = new IndexWriter(dir, iwc); //需要建立 索引的数据 List<User> users = userService.getAll(); //从数据库获取数据 for(User u : users){ Document doc = new Document(); // int 要转换 String doc.add(new Field("id",String.valueOf(u.getId()), Field.Store.YES, Field.Index.ANALYZED)); doc.add(new Field("username",u.getUsername(), Field.Store.YES, Field.Index.ANALYZED)); writer.addDocument(doc); } writer.close(); long endTime = new Date().getTime(); System.out.println("这花费了 " + (endTime - stime)+ "毫秒来把数据增加到索引"+indexPath+"里面去!"); return SUCCESS; } 结果如下: 开始创建索引。。。 这花费了 1285毫秒来把数据增加到索引C:/lucene-doc里面去! 4、根据关键字,检索: /** * 从Lucene索引库中——搜索 */ public String searchKeyword() throws Exception { System.out.println("开始检索。。。"); long startTime = new Date().getTime(); String indexPath = Configuration.getInstance().read("config.properties", "indexPath"); users = new ArrayList<User>(); IndexReader reader = IndexReader.open(FSDirectory.open(new File(indexPath))); IndexSearcher searcher = new IndexSearcher(reader); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36); String field = "username";//设置一个默认的field,因为在用户没有指定field时,lucene会在默认的field中检索 QueryParser parser = new QueryParser(Version.LUCENE_36, field, analyzer); Query query = parser.parse(keyword); //搜索关键词 searcher.search(query, null, 100); TopDocs results = searcher.search(query, 10); //只取排名前10的搜索结果 ScoreDoc[] hits = results.scoreDocs; Document doc = null; for(ScoreDoc scorceDoc : hits){ doc = searcher.doc(scorceDoc.doc); User u = new User(); u.setId(Integer.parseInt(doc.get("id"))); // u.setUsername(doc.get("username")); //不高亮 u.setUsername(this.getHighLight(doc, analyzer, query, "username"));//使用高亮 users.add(u); } searcher.close(); reader.close(); long endTime = new Date().getTime(); System.out.println("检索花费了 " + (endTime - startTime)+ "毫秒来把数据从"+indexPath+"里面检索出来!"); for(User u : users){ System.out.println("以下是检索结果:"+u.getUsername()+"---"+u.getId()); } return SUCCESS; } 5、高亮方法 public String getHighLight(Document doc,Analyzer analyzer,Query query,String field)throws Exception{ //设置高亮显示格式 SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'><strong>", "</strong></font>"); /* 语法高亮显示设置 */ Highlighter highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(query)); highlighter.setTextFragmenter(new SimpleFragmenter(100)); // 取 field 字段值,准备进行高亮 String fieldValue = doc.get(field); TokenStream tokenStream = analyzer.tokenStream(field,new StringReader(fieldValue)); //转成高亮的值 String highLightFieldValue = highlighter.getBestFragment(tokenStream, fieldValue); if(highLightFieldValue == null) highLightFieldValue = fieldValue; return highLightFieldValue; } PS:还有几个全局变量: private String keyword; private List<User> users; 以上代码是在ssh框架中实现的,代码不好打包上传。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2013-02-26
学习了
|
|
返回顶楼 | |