`
ithoney
  • 浏览: 4020 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

相关推荐

    lucene3.6 搜索例子

    Apache Lucene 是一个开源全文搜索引擎库,为开发者提供了在Java应用程序中实现高效、可扩展的搜索功能的工具。在本篇文章中,我们将深入探讨Lucene 3.6版本中的搜索功能,通过实例解析其核心概念和操作流程。 一、...

    lucene 3.6

    通过学习 Lucene 3.6,你可以掌握全文检索的核心原理,这对于构建自己的搜索引擎或者在项目中实现高效文本搜索功能至关重要。记得结合源代码分析,加深对概念的理解,同时不断实践,才能更好地掌握这一强大的搜索...

    Lucene使用教程

    ### Lucene 使用教程 ...通过理解这些基本概念,你可以更好地掌握如何利用Lucene来构建高效的全文搜索引擎。Lucene的强大之处在于其灵活性和可扩展性,因此开发者可以根据具体的应用场景灵活地调整索引和查询策略。

    solr教材-PDF版

    - **1.2.3 查询**:Solr支持复杂的查询语言,包括全文检索、布尔运算符、短语匹配等,为用户提供准确的搜索结果。 - **1.2.4 核心**:Solr中的“核心”是指一个独立的索引库,每个核心可以独立配置和管理。 - **...

    Solrj 中文教程

    - **基于Lucene自封装实现站内搜索**:这种方式可以提供高度的定制化能力,但开发工作量大且后期维护成本较高。 - **调用Google或Baidu等第三方搜索引擎API**:虽然这种方式能够快速实现站内搜索功能,但存在数据...

    开源企业搜索引擎SOLR的应用教程

    1. **基于Lucene自封装实现站内搜索**:虽然此方案具有较高的灵活性,但考虑到开发工作量大且后期维护成本较高,一般不作为首选。 2. **调用第三方搜索引擎API**(如Google、Baidu):这种方式虽然简便快捷,但由于...

    开源企业搜索引擎SOLR的 应用教程

    **3.2 一个简单的例子** - **3.2.1 SolrSchema设计** 假设需要为一个新闻网站设计索引结构,可以定义如下字段: - `id`:唯一标识。 - `title`:标题。 - `content`:内容。 - `date`:日期。 - **3.2.2 ...

Global site tag (gtag.js) - Google Analytics