1. Lucene简介

Lucene是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。Lucene以其方便使用、快速实施以及灵活性受到广泛的关注。它可以方便地嵌入到各种应用中实现针对应用的全文索引、检索功能。

2. lucene 的包结构

1、analysis对需要建立索引的文本进行分词、过滤等操作

2、standard是标准分析器

3、document提供对Document和Field的各种操作的支持。

4、index是最重要的包,用于向Lucene提供建立索引时各种操作的支持

5、queryParser提供检索时的分析支持

6、search负责检索

7、store提供对索引存储的支持

8、util提供一些常用工具类和常量类的支持

Lucene中的类主要组成如下:

1)org.apache.1ucene.analysis语言分析器,主要用于的切词Analyzer是一个抽象类,管理对文本内容的切分词规则。

2)org.apache.1uceene.document索引存储时的文档结构管理,类似于关系型数据库的表结构。

3)document包相对而言比较简单,该包下面有3个类,document相对于关系型数据库的记录对象,Field主要负责字段的管理。

4)org.apache.1ucene.index索引管理,包括索引建立、删除等。索引包是整个系统核心,全文检索的根本就是为每个切出来的词建索引,查询时就只需要遍历索引,而不需要去正文中遍历,从而极大的提高检索效率。

5)org.apache.1ucene.queryParser查询分析器,实现查询关键词间的运算,如与、或、非等。

6)org.apache.1ucene.search检索管理,根据查询条件,检索得到结果。

7)org.apache.1ucene.store数据存储管理,主要包括一些底层的I/0操作。

8)org.apache.1ucene.util一些公用类。

3. Document文档

1)void add(Field field) 往Document对象中添加字段

2)void removeField(String name)删除字段。若多个字段以同一个字段名存在,则删除首先添加的字段;若不存在,则Document保持不变

3)void removeFields(String name)删除所有字段。若字段不存在,则Document保持不变

4)Field getField(String name)若多个字段以同一个字段名存在,则返回首先添加的字段;若字段不存在,则Document保持不变

5)Enumeration fields()返回Document对象的所有字段,以枚举类型返回

6)Field [] getFields(String name)根据名称得到一个Field的数组

7)String [] getValues(String name)根据名称得到一个Field的值的数组

Document doc1 = new Document();

doc1.add(new Field("name", "word1 word2 word3",Field.Store.NO,Field.Index.TOKENIZED));

Document doc2 = new Document();

doc2.add(new Field("name", "word1 word2 word3",Field.Store.NO,Field.Index.TOKENIZED));

4. Field字段

new  Field("name", "word1 word2 word3",Field.Store.YES,Field.Index.TOKENIZED)

(1)store类有3个公有的静态属性:

Store.NO:表示该Field不需要存储

Store.YES:表示该Field需要存储

Store.COMPRESS:表示用压缩方式来保存这个Field的值

(2)index类有4个公有的静态属性:

Index.NO:不需要索引

Index.TOKENIZED:先被分词再被索引

Index.UN_TOKENIZED:不对该Field进行分词,但会对它进行索引

Index.NO_NORMS:对该Field进行索引,但是不使用Analyzer,同时禁止它参加评分,主要是为了减少内存的消耗。

(3)Field类的构造方法

public  Field(String name,String value,Store store,Index index);//直接的字符串方式

public  Field(String name,String value,Store store,Index index,TermVector  termVector);

public  Field(String name,String value,Reader reader);//使用Reader从外部传入

public  Field(String name,String value,Reader reader,TermVector termVector);

public  Field(String name,byte[] value,Store store)//使用直接的二进制byte传入

当Field值为二进制时,可以使用Lucene的压缩功能将其值进行压缩。

5.索引文件格式

1).fnm格式  包含了Document中所有field名称

2).fdt与.fdx格式  .fdt文件用于存储具有Store.YES属性的Field的数据;.fdx是一个索引,用于存储Document在.fdt中的位置。

3).tis 与.tii格式  .tis文件用于存储分词后的词条(Term),而.tii就是它的索引文件,它表明了每个.tis文件中的词条的位置。

4)deletable格式 文档被删除后,会首先在deletable文件中留下一个记录,要真正删除时,才将索引除去。

5)复合索引格式 .cfs

使用IndexWriter的useCompoundFile()  默认为True

6.Directory索引的存放位置

a)FSDirectory.getDirectory(path, true)第二个参数表示删除掉目录内原有内容

IndexWriter writer = new IndexWriter(FSDirectory.getDirectory(path, true), new StandardAnalyzer(), true);//删除原有索引

FSDirectory fsDir=FSDirectory.getDirectory(path,true);

IndexWriter writer = new IndexWriter(fsDir, new StandardAnalyzer(), true);

bRAMDirectory在内存中存放,读取速度快,但程序一运行结束,它的内容就不存在了

RAMDirectory ramDir=new RAMDirectory();

IndexWriter writer = new IndexWriter(ramDir, new StandardAnalyzer(), true);

IndexWriter writer = new IndexWriter(new RAMDirectory(), new StandardAnalyzer(), true);

7.优化索引

writer.optimize();

将磁盘上的多个segment进行合并,组成一个全新的segment。这种方法并不会增加建索时的速度,反而会降低建索的速度。所以应该在建完索引后在调用这个函数

8.索引的合并

RAMDirectory RAMDir=new RAMDirectory();

IndexWriter writer = new IndexWriter(RAMDir, new StandardAnalyzer(), true);//删除原有索引

IndexWriter writer2=new IndexWriter(FSDirectory.getDirectory(path,true),new StandardAnalyzer(), true);

writer.addDocument(doc1);

writer2.addDocument(doc2);

writer.close();

writer2.addIndexes(new Directory[]{RAMDir});

writer2.close();

注意:在合并前一定要先关闭要加的索引器。

9.Lucene的索引“锁”

1.  write.lock

2.  commit.lock

更多精彩文章请关注 =》 我爱学框架

http://www.itframe.top/

最新文章

  1. Android Git 客户端
  2. C#语言的基础
  3. [LintCode] Backpack VI 背包之六
  4. Teamwork——Week 4 Daily Scrum Meeting#1 2013.10.23
  5. WinPcap编程(一)
  6. qingshow “不积跬步无以至千里,不积小流无以成江海”。--荀子《劝学篇》 用tomcat+花生壳搭建自己的web服务器+域名(参考)
  7. 解决sqlserver2008 r2 登陆时报错:provider 命名管道提供程序, error40 错误2
  8. Struts2学习笔记(五)——Action访问Servlet API
  9. ●BZOJ 2743 [HEOI2012]采花
  10. java的系统时间,怎么计算从现在到凌晨还剩下多少时间?
  11. PHP设计模式概述
  12. JavaScript 脚本运行方式
  13. 用shell统计表格数据
  14. laravel 修改时邮箱字段唯一性验证时忽略指定 ID
  15. Windows系统下在Git Bash中把文件内容复制到剪贴板的命令
  16. DLLImport的用法C#
  17. ionic3使用第三方图标
  18. x64 assembler fun-facts(转载)
  19. 《Python绝技:运用Python成为顶级黑客》 用Python刺探网络
  20. Python 字串处理

热门文章

  1. java 注解(转)
  2. 树莓pi快速ssh【校园网】
  3. 关于hibernate映射过程中的笔记
  4. 异常(Exception)
  5. HDU-4696 Answers 纯YY
  6. HDU 1890--Robotic Sort(Splay Tree)
  7. 字符流缓冲区BufferedReader之readLine方法的原理
  8. 转载StringBuilder说明
  9. rank() | dense_rank() | row_number() over(PARTITION BY sex order by age desc ) 的区别
  10. Java数据类型(一)