开源全文搜索工具包Lucene2.9.1的使用

1. 搭建Lucene的开发环境:
   1) 在classpath中添加lucene-core-x.x.x.jar包
  
2. 全文搜索的两个工作
   1) 建立索引文件:
   2) 搜索索引:
  
3. Lucene的索引文件逻辑结构:
  1) 索引(Index)由若干块(片段)(Segment)组成
  ★2) 块由若干文档(Document)组成: 一个文件映射成一个文档。数据库表中的一条记录映射成一个文档。
  ★3) 文档由若干域(Field)组成:文件的属性(文件路径,文件的内容)映射成一个域。记录的某个字段映射成一个域。
  ☆4) 域由若干词(关键字)(Term)组成:文件的属性的内容中某个字符串映射成一个词。
 
4. Lucene包结构:
1) analysis模块:负责词法分析及语言处理而形成Term(词)。提供了一些内置的分析器:最常用的是StandardAnalyzer
2) index模块:负责索引的读写。
       对索引文件的segment进行写、合并、优化的IndexWriter类。对索引进行读取和删除操作的IndexReader类。
3) store模块:负责索引的存储。提供索引的各种存储类:FSDirectory,RAMDirectory等。
4) document模块:索引文件内部的基础存储结构封装。如:Document类和Field类等。
5) search模块:负责对索引的搜索。提供了索引搜索器IndexSearcher类和各种Query类,如TermQuery、BooleanQuery等。
6) queryParser模块:负责查询语句的语法分析。提供了解析查询语句的QueryParser类
7) util模块:包含一些公共工具类。

5. 创建索引:
  1) IndexWriter:索引写出器
     a) 构造方法:
        IndexWriter(Directory d, Analyzer a, IndexWriter.MaxFieldLength mfl)
                              如果索引不存在,就会被创建。如果索引存在,就追加.
        IndexWriter(Directory d, Analyzer a, boolean create, IndexWriter.MaxFieldLength mfl)
           create为true时,原索引文件不存在就创建,存在就覆盖。
           create为false时,原索引文件不存在就报错,存在就追加。
     b) 常用方法:
        void addDocument(Document doc);  //把指定文档添加到索引写出器中
        void iw.close();  //关闭索引写出器,此时才把索引写到目标存储地
 
  2) Directory: 索引存放地。
     a) 文件系统: FSDirectory  FSDirectory.open(File file);
     b) 内存:  RAMDirectory  new RAMDirectory();
 
  3) Analyzer: 分词器。
     a) StandardAnalyzer: 标准的分词器。对英文采用空格,标点符号进行分词。对中文采用单字分词。
     b) SmartChineseAnalyzer: 智能中文分词器。(LUCENE_HOME/contrib/analyzers/smartcn/lucene-smartcn-2.9.1.jar)
     C) 第三方的中文分词器:PaodingAnalyzer、IKAnalyzer
 
  4) IndexWriter.MaxFieldLength: 指定域值的最大长度。
     a) UNLIMITED 无限制的。
     b) LIMITED 有限制的. 值为10000
 
  5) Document: 索引的组成单元. 一组Field的集合.
     a) 构造方法: Document();
     b) 常用方法: void add(Field f);  //添加指定域到这个文档中
    
  6) Field: 域,代表文档的某个索引域.
     a) 构造方法: Field(String name, String value, Field.Store.YES, Field.Index.ANALYZED)
        name: 域的名称, 只能是字符串.
        value: 域的值, 只能是字符串.
        Field.Store: 指定Field的值是否存储或怎样存储. NO(不存储), YES(存储),COMPRESS(压缩后存储)
        Field.Index: 指定Field是否被索引或怎么被索引. NO(不索引), ANALYZED(分词后索引), NOT_ANALYZED(不分词直接索引)
    
6. 查询索引:
  1) IndexSearcher: 索引查询器
     a) 构造器:IndexSearcher(Directory path, boolean readOnly)
     b) 常用方法: TopDocs search(Query query, Filter filter, int n);  //执行查询
                Document doc(int 文件内部编号);  //根据文档的内部编号获取到该Document
                void close();  //关闭查询器
  
  2) Query:查询对象。把用户输入的查询字符串封装成Lucene能够识别的Query对象。
  3) Filter:用来过虑搜索结果的对象。
  4) int n:最多返回的Document的数量。
  5) TopDocs: 代表查询结果集信息对象。
             它有两个属性:
     a) totalHits: 可以获取查询命中数。
     b) scoreDocs: 可得到查询结果。它包含符合条件的文档的内部编号(doc)及评分(score)。
 
7. 删除索引:
   IndexWriter提供deleteDocuments(Term term);  //会删除索引文件里含有指定Term的所有Document。
   IndexReader也提供了deleteDocuments(Term term);

8. 更新索引:
   IndexWriter.updateDocument(Term term, Document doc); //实际上是先删除再创建索引。

9. 优化
 1) 使用IndexWriter须注意
        修改索引后,需flush()或close()方能使修改生效
        非线程安全,任一时刻仅能有一个线程对其操作.Lucene不负责多线程同步,同步问题由应用程序自己解决
 2) 使用IndexSearcher须注意
        一旦打开,不会搜索到以后添加的索引
       是线程安全的,多个线程仅需一个实例
 3) 最佳实践
    多个线程共享一个IndexSearcher, 只有当索引修改后才重新打开IndexSearcher
    多个线程共享一个IndexWriter并严格同步
    异步修改索引提高性能
    为每个JavaBean创建单独的索引目录
   
10. 在emall项目中整合Lucene对产品的名称和描述进行全文搜索

11. 使用Paoding分词器:当前版本为2.0.4-beta.
   0) 添加系统环境变量:PAODING_DIC_HOME=磁盘某个目录路径。把下载包内dic目录下的词典拷贝到这个目录下。安装词典。
   1) 添加paoding-analysis.jar到classpath
   2) 直接创建PaodingAnalyzer实例,即可。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/JavaBYX/archive/2009/12/23/5054484.aspx

posted @ 2010-07-05 23:43  冰封的心  阅读(337)  评论(0编辑  收藏  举报