lucene入门整理.docx
- 文档编号:5151696
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:23
- 大小:33.55KB
lucene入门整理.docx
《lucene入门整理.docx》由会员分享,可在线阅读,更多相关《lucene入门整理.docx(23页珍藏版)》请在冰豆网上搜索。
lucene入门整理
1.概述
Lucene是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。
Lucene以其方便使用、快速实施以及灵活性受到广泛的关注。
它可以方便地嵌入到各种应用中实现针对应用的全文索引、检索功能,本总结使用lucene--2.3.2。
2.lucene 的包结构
1、org.apache.lucene.analysis对需要建立索引的文本进行分词、过滤等操作,语言分析器,主要用于的切词Analyzer是一个抽象类,管理对文本内容的切分词规则。
2、org.apache.lucene.analysis.standard是标准分析器
3、org.apache.lucene.document提供对Document和Field的各种操作的支持。
索引存储时的文档结构管理,类似于关系型数据库的表结构。
Document相对于关系型数据库的记录对象,Field主要负责字段的管理。
4、org.apache.lucene.index是最重要的包,用于向Lucene提供建立索引时各种操作的支持。
索引管理,包括索引建立、删除等。
索引包是整个系统核心,全文检索的根本就是为每个切出来的词建索引,查询时就只需要遍历索引,而不需要去正文中遍历,从而极大的提高检索效率。
5、org.apache.lucene.queryParser提供检索时的分析支持。
查询分析器,实现查询关键词间的运算,如与、或、非等。
6、org.apache.lucene.search负责检索。
检索管理,根据查询条件,检索得到结果。
7、org.apache.lucene.store提供对索引存储的支持。
数据存储管理,主要包括一些底层的I/0操作。
8、org.apache.lucene.util提供一些常用工具类和常量类的支持
3.索引文件格式
a).fnm格式包含了Document中所有field名称
b).fdt与.fdx格式.fdt文件用于存储具有Store.YES属性的Field的数据;.fdx是一个索引,用于存储Document在.fdt中的位置。
c).tis与.tii格式.tis文件用于存储分词后的词条(Term),而.tii就是它的索引文件,它表明了每个.tis文件中的词条的位置。
d)deletable格式文档被删除后,会首先在deletable文件中留下一个记录,要真正删除时,才将索引除去。
e)复合索引格式.cfs
使用IndexWriter的useCompoundFile()默认为True
4.lucene中主要的类
4.1.Document文档类
4.1.1.常用方法
方法
描述
voidadd(Fieldfield)
往Document对象中添加字段
voidremoveField(Stringname)
删除字段。
若多个字段以同一个字段名存在,则删除首先添加的字段;若不存在,则Document保持不变
voidremoveFields(Stringname)
删除所有字段。
若字段不存在,则Document保持不变
FieldgetField(Stringname)
若多个字段以同一个字段名存在,则返回首先添加的字段;若字段不存在,则Document保持不变
Enumerationfields()
返回Document对象的所有字段,以枚举类型返回
Field[]getFields(Stringname)
根据名称得到一个Field的数组
String[]getValues(Stringname)
根据名称得到一个Field的值的数组
4.1.2.示例
Documentdoc1=newDocument();
doc1.add(newField("name","word1word2word3",
Field.Store.NO,Field.Index.TOKENIZED));
Documentdoc2=newDocument();
doc2.add(newField("name","word1word2word3",
Field.Store.NO,Field.Index.TOKENIZED));
4.2.Field字段类
4.2.1.构造方法
1)publicField(Stringname,Stringvalue,Storestore,Indexindex);//直接的字符串方式
2)publicField(Stringname,Stringvalue,Storestore,Indexindex,TermVectortermVector);
3)publicField(Stringname,Stringvalue,Readerreader);//使用Reader从外部传入
4)publicField(Stringname,Stringvalue,Readerreader,TermVectortermVector);
5)publicField(Stringname,byte[]value,Storestore)//使用直接的二进制byte传入
当Field值为二进制时,可以使用Lucene的压缩功能将其值进行压缩。
4.2.2.Store类
静态属性
描述
Store.NO
表示该Field不需要存储
Store.YES
表示该Field需要存储
Store.COMPRESS
表示用压缩方式来保存这个Field的值
4.2.3.Index类
静态属性
描述
Index.NO
不需要索引
Index.TOKENIZED
先被分词再被索引
Index.UN_TOKENIZED
不对该Field进行分词,但会对它进行索引
Index.NO_NORMS
对该Field进行索引,但是不使用Analyzer,同时禁止它参加评分,主要是为了减少内存的消耗。
4.2.4.示例
newField("name","word1word2word3",Field.Store.YES,Field.Index.TOKENIZED)
4.3.IndexWriter类
4.3.1.构造方法
1)publicIndexWriter(Stringpath,Analyzera,Booleancreate)
2)publicIndexWriter(Filepath,Analyzera,Booleancreate)
3)publicIndexWriter(Directoryd,Analyzera,Booleancreate)
第一个参数:
索引存放在什么地方
第二个参数:
分析器,继承自org.apache.lucene.analysis.Analyzer类
第三个参数:
为true时,IndexWriter不管目录内是否已经有索引了,一律清空,重新建立;当为false时,则IndexWriter会在原有基础上增量添加索引。
所以在更新的过程中,需要设置该值为false。
4.3.2.添加文档
publicvoidaddDocument(Documentdoc)
publicvoidaddDocument(Documentdoc,Analyzeranalyzer)//使用一个开发者自定义的,而非事先在构建IndexWriter时声明的Analyzer来进行分析
writer.addDocument(doc1);
4.3.3.性能参数
1)mergeFactor控制Lucene在把索引从内存写入磁盘上的文件系统时内存中最大的Document数量,同时它还控制内存中最大的Segment数量。
默认为10.
writer.setMergeFactor(10);
2)maxMergeDocs限制一个Segment中最大的文档数量。
一个较大的maxMergeDocs适用于对大批量的文档建立索引,增量式的索引则应使用较小的maxMergeDocs。
writer.setMaxMergeDocs(1000);
3)minMergeDocs用于控制内存中持有的文档数量的,它对磁盘上的Segment大小没有任何影响。
4.3.4.限制Field的长度
maxFieldLength限制Field的长度,默认值为10000.最大值100000个。
publicvoidsetMaxFieldLength(intmaxFieldLength)
writer.addDocument(doc1);
writer.setMaxFieldLength(100000);
writer.addDocument(doc2);
4.3.5.复合索引格式
setUseCompoundFile(Boolean)默认true
writer.setUseCompoundFile(true);//复合索引
writer.setUseCompoundFile(false);
4.3.6.优化索引
writer.optimize();
将磁盘上的多个segment进行合并,组成一个全新的segment。
这种方法并不会增加建索时的速度,反而会降低建索的速度。
所以应该在建完索引后在调用这个函数
4.3.7.示例
IndexWriterwriter=newIndexWriter(path,newStandardAnalyzer(),true);
writer.addDocument(doc1);
writer.addDocument(doc2);
Sytem.out.println(writer.docCount());
writer.close();
IndexSearchersearcher=newIndexSearcher(path);
Hitshits=null;
Queryquery=null;
QueryParserparser=newQueryParser("name",newStandardAnalyzer());
query=parser.parse("word1");
hits=searcher.search(query);
System.out.println("查找word1共"+hits.length()+"个结果");
4.4.Directory类
Directory:
用于索引的存放位置
a)FSDirectory.getDirectory(path,true)第二个参数表示删除掉目录内原有内容
IndexWriterwriter=newIndexWriter(FSDirectory.getDirectory(path,true),newStandardAnalyzer(),true);//删除原有索引
或
FSDirectoryfsDir=FSDirectory.getDirectory(path,true);
IndexWriterwriter=newIndexWriter(fsDir,newStandardAnalyzer(),true);
b)RAMDirectory在内存中存放,读取速度快,但程序一运行结束,它的内容就不存在了
RAMDirectoryramDir=newRAMDirectory();
IndexWriterwriter=newIndexWriter(ramDir,newStandardAnalyzer(),true);
或
IndexWriterwriter=newIndexWriter(newRAMDirectory(),newStandardAnalyzer(),true);
4.5.IndexReader类
IndexReader类――索引的读取工具
4.5.1.删除文档
IndexReaderreader=IndexReader.open(path);
reader.deleteDocument(0);//删除第一个
reader.close();
4.5.2.反删除
reader.undeleteAll();
4.5.3.按字段删除
reader.deleteDocuments(newTerm("name","word1"));
若要真正物理删除,则只需使用IndexWriter对索引optimize一次即可!
4.5.4.示例
IndexReaderreader=IndexReader.open(path);
for(inti=0;i System.out.println(reader.document(i)); } System.out.println("版本: "+reader.getVersion()); System.out.println("索引内的文档数量: "+reader.numDocs()); //reader.deleteDocuments(newTerm("name","word1")); Termterm1=newTerm("name","word1"); TermDocsdocs=reader.termDocs(term1); while(docs.next()) { System.out.println("含有所查找的"+term1+"的Document的编号为"+docs.doc()); System.out.println("Term在文档中的出现次数"+docs.freq()); } reader.close(); 4.6.IndexModifier类 集成了IndexWriter的大部分功能和IndexReader中对索引删除的功能------Lucene2.0的新类 4.6.1.示例 publicstaticvoidmain(String[]args)throwsException{ IndexModifiermodifier=newIndexModifier("C: \\Q1",newStandardAnalyzer(),true); Documentdoc1=newDocument(); doc1.add(newField("bookname","钢铁是怎样炼成的",Field.Store.YES,Field.Index.TOKENIZED)); Documentdoc2=newDocument(); doc2.add(newField("bookname","山山水水",Field.Store.YES,Field.Index.TOKENIZED)); modifier.addDocument(doc1); modifier.addDocument(doc2); System.out.println(modifier.docCount()); modifier.setUseCompoundFile(false); modifier.close(); IndexModifiermo=newIndexModifier("C: \\Q1",newStandardAnalyzer(),false); mo.deleteDocument(0); System.out.println(mo.docCount()); mo.close(); } 4.7.IndexSearcher类 4.7.1.构造方法 IndexSearchersearcher=newIndexSearcher(Stringpath); IndexSearchersearcher=newIndexSearcher(Directorydirectory); IndexSearchersearcher=newIndexSearcher(IndexReaderr); IndexSearchersearcher=newIndexSearcher(IndexReaderr,BooleancloseReader); IndexSearchersearcher=newIndexSearcher(path); IndexSearchersearcher=newIndexSearcher(FSDirectory.getDirectory(path,false)); 4.7.2.search方法 //返回Hits对象 publicHitssearch(Queryquery) publicHitssearch(Queryquery,Filterfilter) publicHitssearch(Queryquery,Sortsort) publicHitssearch(Queryquery,Filterfilter,Sortsort) //检索只返回得分最高的Document publicTopDocssearch(Queryquery,Filterfilter,intn) publicTopDocssearch(Weightweight,Filterfilter,intn) publicTopFieldDocssearch(Weightweight,Filterfilter,intn,Sortsort) publicTopFieldDocssearch(Queryquery,Filterfilter,intn,Sortsort) //传入HitCollector,将结果保存在HitCollector中 publicvoidsearch(Queryquery,HitCollectorresults) publicvoidsearch(Queryquery,Filterfilter,HitCollectorresults) publicvoidsearch(Weightweight,Filterfilter,HitCollectorresults) 4.7.3.Searcher的explain方法 publicExplainationexplain(Queryquery,intdoc)throwsIOException for(inti=0;i { Documentd=hits.doc(i); System.out.println(i+""+hits.score(i)+""+d.get("contents")); System.out.println(searcher.explain(query,hits.id(i)).toString()); } 4.7.4.示例 IndexSearchersearcher=newIndexSearcher(path); Hitshits=null; Queryquery=null; QueryParserparser=newQueryParser("contents",newStandardAnalyzer()); query=parser.parse("11"); hits=searcher.search(query); System.out.println("查找word1共"+hits.length()+"个结果"); for(inti=0;i { Documentd=hits.doc(i); System.out.println(d+""+i+""+hits.score(i)+""+d.get("contents")); } searcher.close(); 4.8.Hits类 4.8.1.概述 Hits类――检索结果 4.8.2.常用方法 方法名 描述 intlength() 返回搜索到结果的总数量 Documentdoc(inti) 返回第i个文档 intid(inti) 返回第i个文档的内部ID号 floatscore(inti) 返回第i个文档的得分 Iteratoriterator() 取得Hits集合的遍历对象 4.8.3.示例 for(inti=0;i { Documentd=hits.doc(i); System.out.println(d+""+""+hits.score(i)+""+d.get("contents")); System.out.println("文档的内部ID号: "+hits.id(i)); } 4.9.QueryParser类 4.9.1.改变默认的布尔逻辑 Ø默认为“或”关系 Queryquery=null; QueryParserparser=newQueryParser("contents",newStandardAnalyzer()); query=parser.parse("helloworld! "); System.out.println(query.toString()); Ø改变默认布尔逻辑 Queryquery=null; QueryParserparser=newQueryParser("contents",newStandardAnalyzer()); parser.setDefaultOperator(QueryParser.AND_OPERATOR); query=parser.parse("helloworld");//若world后加! 会出错 System.out.println(query.toString()); ØANDORNOT–关键字 也可以不用改变默认布尔逻辑,而直接让用户在输入关键字时指定不同词条间的布尔联系。 例如,用户输入helloANDworld必须为大写 逻辑与: AND(大写) 逻辑或: OR(大写) 逻辑非: -例如: hello-world 也可以是NOT例如: helloNOTworld 4.9.2.不需要分词 不进行分词,将其完整的作为一个词条进行处理,则需要在词组的外面加上引号 StringqueryStr="\"Godhelpsthosewhohelpthemselves\""; QueryParserparser=newQueryParser("bookname",newStandardAnalyzer()); parser.setDefaultOperator(QueryParser.AND_OPERATOR); Queryquery=parser.parse(queryStr);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lucene 入门 整理