开发界
首页 移动开发 在线交易 IT笔记 网络技术 操作系统 企业架构 数据库 考试认证 IT培训 开源软件 数据存储 行业资讯
大家都在看:java   开发   C#   oracle   mysql   android   web开发   学习   sqlserver   linux   asp   php   ajax   javascript   css   html
Lucene3.6实现全文检索的小例子
2013-02-22 10:01:48 来源:开发界 作者:admin 栏目:lucene 责任编辑:admin
[导读]Lucene3.6实现全文检索的小例子

  引入jar包::

  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框架中实现的,代码不好打包上传。



版权所有:转载请注明出处!
分享到:
上一篇SpringMVC环境搭建 下一篇Lucene为数据库中数据建立索引时..
您可能还喜欢
考试认证 更多
开发技术 更多
移动开发 更多

关于开发界 | 合作伙伴 | 联系我们 | 友情链接 | 版权声明 | 网站制作 | 网站地图 | 加入收藏 | 设为首页

Copyright@2012-2016 开发界 京ICP备12027873号