Lucene全文检索系列(一)
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/
Lucene全文检索系列(一)的更多相关文章
- Lucene全文检索技术
Lucene全文检索技术 今日大纲 ● 搜索的概念.搜索引擎原理.倒排索引 ● 全文索引的概念 ● 使用Lucene对索引进行CRUD操作 ● Lucene常用API详解 ● ...
- Apache Lucene(全文检索引擎)—创建索引
目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 本项目Demo已上传GitHub,欢迎大家fork下载学习:https://gith ...
- 使用Lucene全文检索并使用中文版和高亮显示
使用Lucene全文检索并使用中文版和高亮显示 中文分词需要引入 中文分词发的jar 包,咱们从maven中获取 <!-- lucene中文分词器 --> <dependency&g ...
- lucene全文检索基础
全文检索是一种将文件中所有文本与检索项匹配的文字资料检索方法.比如用户在n个小说文档中检索某个关键词,那么所有包含该关键词的文档都返回给用户.那么应该从哪里入手去实现一个全文检索系统?相信大家都听说过 ...
- lucene 全文检索工具的介绍
Lucene:全文检索工具:这是一种思想,使用的是C语言写出来的 1.Lucene就是apache下的一个全文检索工具,一堆的jar包,我们可以使用lucene做一个谷歌和百度一样的搜索引擎系统 2. ...
- Lucene 全文检索 Lucene的使用
Lucene 全文检索 Lucene的使用 一.简介: 参考百度百科: http://baike.baidu.com/link?url=eBcEVuUL3TbUivRvtgRnMr1s44nTE7 ...
- Lucene全文检索_分词_复杂搜索_中文分词器
1 Lucene简介 Lucene是apache下的一个开源的全文检索引擎工具包. 1.1 全文检索(Full-text Search) 1.1.1 定义 全文检索就是先分词创建索引,再执行搜索的过 ...
- Lucene 全文检索
基于 lucene 8 1 Lucene简介 Lucene是apache下的一个开源的全文检索引擎工具包. 1.1 全文检索(Full-text Search) 全文检索就是先分词创建索引,再执行搜索 ...
- Apache Lucene(全文检索引擎)—分词器
目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 本项目Demo已上传GitHub,欢迎大家fork下载学习:https://gith ...
随机推荐
- 第一章 Lambda表达式
1.1 Why Lambdas? 当你操作多线程的时候,你会像下面这样将要处理的代码放到run()函数中: class Worker implements Runnable { public void ...
- EF5.0修改实体的时候,出现“对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性这个错误
对于这个错误,要在SaveChanges前关闭验证实体有效性(ValidateOnSaveEnabled)这个开关 db.Configuration.ValidateOnSaveEnabled = f ...
- SMG12232ZK标准字符点阵型液晶显示模块的演示程序[C51编程语言][MCS51并行接口方式]
//SMG12232ZK标准字符点阵型液晶显示模块的演示程序[C51编程语言][MCS51并行接口方式] //应用产品: SMG12232ZK标准中文字符点阵型液晶显示模块 // 本演示程序适用于SM ...
- 【暑假】[实用数据结构]UVa11997 K Smallest Sums
UVa11997 K Smallest Sums 题目: K Smallest Sums You're given k arrays, each array has k integers. Ther ...
- NOIP2006 能量项链
洛谷1063 能量项链 本题地址:http://www.luogu.org/problem/show?pid=1063 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N ...
- uvalive 4119 Always an Interger
差分数列+字符串处理 题意:是让你判断一个整系数多项式的值是否一直都能被一个所给的正整数所整除. 通过对差分数列的不断求导,我们可以发现,对于任意多项式P,我们只需要判断n从1到k+1是否满足就行了, ...
- C#进程同名的问题
当一个进程中,判断另一个进程存在还是不存在可以使用Process.GetProcessesByName()方法来判断.但是仅仅使用Name来做区分的话,是有问题的.如何能保证这个名称的进程就是所希望的 ...
- BNUOJ-26579 Bread Sorting YY
题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26579 考虑两个性质:蚂蚁的相对位置不变,蚂蚁碰撞时相当于对穿而过,然后排两次序就可以了. ...
- BNUOJ-29357 Bread Sorting 模拟
题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29357 直接模拟就可以了.. //STATUS:C++_AC_190MS_1884KB # ...
- 基于Qt的P2P局域网聊天及文件传送软件设计
基于Qt的P2P局域网聊天及文件传送软件设计 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<通信网络>的课程设计作业,之 ...