河南许斌

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Lucene是全文检索引擎

一.在学习Lucene之前我们先思考下,Lucene存在的意义.

1.在之前我们的应用场景中,基于数据库的检索,我们使用like语法进行.但是基于like语法效率低下.达不到我们对应用的使用要求.

而使用Lucene对我们的数据建立索引效率高速度快,满足企业要求.

我们使用Lucene先对整个结构建立索引库,然后根据索引去查找我们需要匹配的内容,效率高速度快,方便我们快速检索信息-这也是Lucene存在的目的.

2.有些查找数据库做不了,比如我们想查找附件中内容的匹配情况.使用传统的数据库开发复杂且效率低.而使用Lucene可以很方便的做到.

二.应用领域

   OA,CMS等系统中,互联网企业

三.版本

  2.9
  3.0 比较大的变动
  3.5 有一些变动

四.Lucene基础

  1. 下载

    http://lucene.apache.org
    到系统官方网站下载3.5.0版本.
    下载版本目录:http://archive.apache.org/dist/lucene/java/

    作者在写此文章时候版本已到:

      5.0.0/                          2015-02-19 08:46    -   
      5.1.0/                          2015-04-13 15:08    -  

  2.Lucene使用

    在全文检索工具中,都是由这样的三部分组成

    1> 索引部分

    2> 分词部分

    3> 搜索部分

  3.基本实例

    1> 创建索引

 1 // 建立索引
 2 public void index(){
 3     // 1.创建Directory-索引创建的地方(内存,硬盘)
 4     Directory directory = null;//= new RAMDirectory();// 建立在内存中
 5     IndexWriter indexWriter = null;
 6     try {
 7         directory = FSDirectory.open(new File("/Users/apple/Downloads/lucene/index"));// 建立在硬盘上
 8         // 2.创建IndexWriter-写索引 
 9         IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35));
10         indexWriter = new IndexWriter(directory, config);
11         // 3.创建Document对象
12         Document doc = null;
13         // 4.为Document添加Filed
14         File f = new File("/Users/apple/Downloads/lucene/lucene/example");
15         for (File file : f.listFiles()) {
16             doc = new Document();
17             doc.add( new Field("content", new FileReader(file)));
18             doc.add( new Field("name", file.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED));
19             doc.add(new Field("path",file.getAbsolutePath(),Field.Store.YES,Field.Index.NOT_ANALYZED));
20             // 5.通过IndexWriter添加Document到索引中
21             indexWriter.addDocument(doc);
22         }
23     } catch (Exception e) {
24         e.printStackTrace();
25     }finally{
26         if(indexWriter!= null){
27             try {
28                 indexWriter.close();
29             } catch (CorruptIndexException e) {
30                 e.printStackTrace();
31             } catch (IOException e) {
32                 e.printStackTrace();
33             }
34         }
35     }
36 }

    2> 搜索索引

public void search(){
    Directory directory = null;//= new RAMDirectory();// 建立在内存中
    IndexWriter indexWriter = null;
    try {
        // 1.创建Directory
        directory = FSDirectory.open(new File("/Users/apple/Downloads/lucene/index"));// 建立在硬盘上
        // 2.创建IndexReader
        IndexReader indexReader  = IndexReader.open(directory);
        // 3.根据IndexReader创建IndexSearcher
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        // 4.创建搜索的Query
        // 创建QueryParser确定要搜索文件的内容,第二个参数表示搜索的域
        QueryParser parser = new QueryParser(Version.LUCENE_35, "content", new StandardAnalyzer(Version.LUCENE_35));
        Query query = parser.parse("Lucene");
        // 5.根据indexSearcher搜索并且返回TopDocs->前10条数据
        TopDocs topDocs = indexSearcher.search(query, 10);
        // 6.根据topDocs获取ScoreDoc对象数组
        ScoreDoc [] sds = topDocs.scoreDocs;
        for (ScoreDoc sd : sds) {
            int docID = sd.doc;// 文档id
            // 7.根据IndexSearcher和ScoreDoc对象获取具体的Document对象
            Document doc = indexSearcher.doc(docID);
            // 8.根据Document对象获取需要的值
            System.out.println(doc.get("name"));
        }
        // 9.关闭Searcher对象
        indexSearcher.close();
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        if(indexWriter!= null){
            try {
                indexWriter.close();
            } catch (CorruptIndexException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
} 

  4.系统架构

 

posted on 2015-05-03 01:35  hacker的人生你不懂  阅读(292)  评论(0编辑  收藏  举报