




免费预览已结束,剩余16页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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() 默认为True4. lucene中主要的类4.1. Document文档类4.1.1. 常用方法方法描述void add(Field field)往Document对象中添加字段void removeField(String name)删除字段。若多个字段以同一个字段名存在,则删除首先添加的字段;若不存在,则Document保持不变void removeFields(String name)删除所有字段。若字段不存在,则Document保持不变Field getField(String name)若多个字段以同一个字段名存在,则返回首先添加的字段;若字段不存在,则Document保持不变Enumeration fields()返回Document对象的所有字段,以枚举类型返回Field getFields(String name)根据名称得到一个Field的数组String getValues(String name)根据名称得到一个Field的值的数组4.1.2. 示例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.2. Field字段类4.2.1. 构造方法1) public Field(String name,String value,Store store,Index index);/直接的字符串方式2) public Field(String name,String value,Store store,Index index,TermVector termVector);3) public Field(String name,String value,Reader reader);/使用Reader从外部传入4) public Field(String name,String value,Reader reader,TermVector termVector);5) public Field(String name,byte value,Store store)/使用直接的二进制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. 示例new Field(name, word1 word2 word3,Field.Store.YES,Field.Index.TOKENIZED)4.3. IndexWriter类4.3.1. 构造方法1) public IndexWriter(String path,Analyzer a,Boolean create)2) public IndexWriter(File path,Analyzer a,Boolean create)3) public IndexWriter(Directory d,Analyzer a,Boolean create)第一个参数:索引存放在什么地方第二个参数:分析器,继承自org.apache.lucene.analysis.Analyzer类第三个参数:为true时,IndexWriter不管目录内是否已经有索引了,一律清空,重新建立;当为false时,则IndexWriter会在原有基础上增量添加索引。所以在更新的过程中,需要设置该值为false。4.3.2. 添加文档public void addDocument(Document doc)public void addDocument(Document doc,Analyzer analyzer)/使用一个开发者自定义的,而非事先在构建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个。public void setMaxFieldLength(int maxFieldLength)writer.addDocument(doc1);writer.setMaxFieldLength(100000);writer.addDocument(doc2);4.3.5. 复合索引格式setUseCompoundFile(Boolean) 默认truewriter.setUseCompoundFile(true);/复合索引writer.setUseCompoundFile(false);4.3.6. 优化索引writer.optimize();将磁盘上的多个segment进行合并,组成一个全新的segment。这种方法并不会增加建索时的速度,反而会降低建索的速度。所以应该在建完索引后在调用这个函数4.3.7. 示例IndexWriter writer = new IndexWriter(path, new StandardAnalyzer(), true);writer.addDocument(doc1);writer.addDocument(doc2);Sytem.out.println(writer.docCount();writer.close();IndexSearcher searcher = new IndexSearcher(path);Hits hits = null;Query query = null;QueryParser parser =new QueryParser(name, new StandardAnalyzer();query =parser.parse(word1);hits = searcher.search(query);System.out.println(查找 word1 共 + hits.length() + 个结果);4.4. Directory类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);b) RAMDirectory在内存中存放,读取速度快,但程序一运行结束,它的内容就不存在了RAMDirectory ramDir=new RAMDirectory();IndexWriter writer = new IndexWriter(ramDir, new StandardAnalyzer(), true);或IndexWriter writer = new IndexWriter(new RAMDirectory(), new StandardAnalyzer(), true);4.5. IndexReader类IndexReader类索引的读取工具4.5.1. 删除文档IndexReader reader=IndexReader.open(path);reader.deleteDocument(0);/删除第一个reader.close();4.5.2. 反删除reader.undeleteAll();4.5.3. 按字段删除reader.deleteDocuments(new Term(name,word1);若要真正物理删除,则只需使用IndexWriter对索引optimize一次即可!4.5.4. 示例IndexReader reader=IndexReader.open(path);for(int i=0;ireader.numDocs();i+)System.out.println(reader.document(i);System.out.println(版本:+reader.getVersion();System.out.println(索引内的文档数量:+reader.numDocs();/reader.deleteDocuments(new Term(name,word1);Term term1=new Term(name,word1);TermDocs docs=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. 示例public static void main(String args) throws Exception IndexModifier modifier=new IndexModifier(C:Q1,new StandardAnalyzer(),true);Document doc1=new Document();doc1.add(new Field(bookname,钢铁是怎样炼成的,Field.Store.YES,Field.Index.TOKENIZED);Document doc2=new Document();doc2.add(new Field(bookname,山山水水,Field.Store.YES,Field.Index.TOKENIZED);modifier.addDocument(doc1);modifier.addDocument(doc2);System.out.println(modifier.docCount();modifier.setUseCompoundFile(false);modifier.close();IndexModifier mo=new IndexModifier(C:Q1,new StandardAnalyzer(),false);mo.deleteDocument(0);System.out.println(mo.docCount();mo.close();4.7. IndexSearcher类4.7.1. 构造方法IndexSearcher searcher = new IndexSearcher(String path);IndexSearcher searcher = new IndexSearcher(Directory directory);IndexSearcher searcher = new IndexSearcher(IndexReader r);IndexSearcher searcher = new IndexSearcher(IndexReader r,Boolean closeReader);IndexSearcher searcher = new IndexSearcher(path);IndexSearcher searcher = new IndexSearcher(FSDirectory.getDirectory(path,false) );4.7.2. search方法/返回Hits对象public Hits search(Query query) public Hits search(Query query,Filter filter) public Hits search(Query query,Sort sort) public Hits search(Query query,Filter filter,Sort sort) /检索只返回得分最高的Documentpublic TopDocs search(Query query,Filter filter,int n)public TopDocs search(Weight weight,Filter filter,int n)public TopFieldDocs search(Weight weight,Filter filter,int n,Sort sort)public TopFieldDocs search(Query query,Filter filter,int n,Sort sort)/传入HitCollector,将结果保存在HitCollector中public void search(Query query,HitCollector results)public void search(Query query,Filter filter,HitCollector results)public void search(Weight weight,Filter filter,HitCollector results)4.7.3. Searcher的explain方法public Explaination explain(Query query,int doc)throws IOExceptionfor(int i=0;ihits.length()&i10;i+)Document d=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. 示例IndexSearcher searcher = new IndexSearcher(path);Hits hits = null;Query query = null;QueryParser parser =new QueryParser(contents, new StandardAnalyzer();query =parser.parse(11);hits = searcher.search(query);System.out.println(查找 word1 共 + hits.length() + 个结果);for(int i=0;ihits.length()&i10;i+)Document d=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. 常用方法方法名描述int length()返回搜索到结果的总数量Document doc(int i)返回第i个文档int id(int i)返回第i个文档的内部ID号float score(int i)返回第i个文档的得分Iterator iterator()取得Hits集合的遍历对象4.8.3. 示例for(int i=0;ihits.length()&i10;i+)Document d=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. 改变默认的布尔逻辑 默认为“或”关系Query query = null;QueryParser parser =new QueryParser(contents, new StandardAnalyzer();query =parser.parse(hello world!);System.out.println(query.toString(); 改变默认布尔逻辑Query query = null;QueryParser parser =new QueryParser(contents, new StandardAnalyzer();parser.setDefaultOperator(QueryParser.AND_OPERATOR);query =parser.parse(hello world);/若world后加!会出错System.out.println(query.toString(); AND OR NOT 关键字也可以不用改变默认布尔逻辑,而直接让用户在输入关键字时指定不同词条间的布尔联系。例如,用户输入 hello AND world 必须为大写逻辑与:AND (大写)逻辑或:OR (大写)逻辑非:- 例如: hello - world也可以是NOT 例如: hello NOT world4.9.2. 不需要分词不进行分词,将其完整的作为一个词条进行处理,则需要在词组的外面加上引号String queryStr=God helps those who help themselves;QueryParser parser = new QueryParser(bookname,new StandardAnalyzer();parser.setDefaultOperator(QueryParser.AND_OPERATOR);Query query=parser.parse(queryStr);System.out.println(query.toString();4.9.3. 设置坡度值,支持FuzzyQueryString queryStr=God helps those who help themselves1;/设置坡度为1QueryParser parser = new QueryParser(bookname,new StandardAnalyzer();Query query=parser.parse(queryStr);System.out.println(query.toString();4.9.4. 设置通配符,支持WildcardQueryString queryStr=wor?QueryParser parser = new QueryParser(bookname,new StandardAnalyzer();parser.setDefaultOperator(QueryParser.AND_OPERATOR);Query query=parser.parse(queryStr);System.out.println(query.toString();4.9.5. 查找指定的FieldString queryStr=linux publishdate:2006-09-01;QueryParser parser = new QueryParser(bookname,new StandardAnalyzer();parser.setDefaultOperator(QueryParser.AND_OPERATOR);Query query=parser.parse(queryStr);System.out.println(query.toString();例如:要求用户选择某一方面的4.9.6. 范围的查找,支持RangeQueryString queryStr=1990-01-01 TO 1998-12-31;QueryParser parser=new QueryParser(publishdate,new StandardAnalyzer();Query query=parser.parse(queryStr);System.out.println(query.toString();输出结果为publishdate:081xmghs0 TO 0boeetj3z因为建立索引时,如果按照日期表示的字符串来进行索引,实际上比较的是字符串的字典顺序。而首先将日期转为以毫秒计算的时间后,则可以精确地比较两个日期的大小了。于是,lucene提供DateTools工具,用来完成其内部对时间的转化和处理,将毫秒级的时间转化为一个长字符串来进行表示,并进行索引。所以,遇到日期型数据时,最好用DateTools进行转换,再进行索引!4.9.7. 现在还不支持SpanQuery4.10. MultiFieldQueryParser类-多域搜索/在不同的Field上进行不同的查找public static Query parse(String queries,String fields,Analyzer analyzer)throws ParseException/在不同的Field上进行同一个查找,指定它们之间的布尔关系public static Query parse(String query,String fields,BooleanClause.Occur flags,Analyzer analyzer) throws ParseException/在不同的Field上进行不同的查找,指定它们之间的布尔关系public static Query parse(String queries,String fields,BooleanClause.Occur flags,Analyzer analyzer)throws ParseExceptionString queries=钢, 10 TO 20;String fields=“bookname”,”price”;BooleanClause.Occur clauses=BooleanClause.Occur.MUST,BooleanClause.Occur.MUST;Query query=MultiFieldQueryParser.parse(queries,fields,clauses,new StandardAnalyzer();System.out.println(query.toString();4.11. MultiSearcher类-多个索引搜索IndexSearcher searcher1=new IndexSearcher(path1);IndexSearcher searcher2=new IndexSearcher(path2);IndexSeacher searchers=searcher1,seacher2;MultiSearcher searcher=new MultiSearcher(searchers);Hits hits=searcher.search(query);for(int i=0;ihits.length();i+)System.out.println(hits.doc(i);4.12. ParalellMultiSearcher类-多线程搜索IndexSearcher searcher1=new IndexSearcher(path1);IndexSearcher searcher2=new IndexSearcher(path2);IndexSearcher searchers=searcher1,searcher2;ParallelMultiSearcher searcher=new ParallelMultiSearcher(searchers);long start=System.currentTimeMillis();Hits hits=searcher.search(query);long end=System.currentTimeMillis();System.out.println(end-start)+ms);5. 排序5.1. Sort类public Sort()public Sort(String field)public Sort(String field,Boolean reverse) /默认为false,降序排序public Sort(String fields)public Sort(SortField field)public Sort(SortField fields)Sort sort=new Sort(“bookname”);按照“bookname“这个Field值进行降序排序Sort sort=new Sort(“bookname”,true) /升序排序Sort sort=new Sort(new String“bookNumber”,”bookname”,”publishdate”);按照三个Field进行排序,但无法指定升序排序,所以用SortField5.2. SortField类public SortField(String field)public SortField(String field,Boolean reverse)public SortField(String field,int type) /type表示当前Field值的类型public SortField(String field,int type,boolean reverse) /默认为false,升序Field值的类型:SortField.STRING、SortField.INT、SortField.FLOATSortField sf1=new SortField(“bookNumber”,SortField.INT,false);SortField sf2=new SortField(“bookname”,SortField.STRING,false);5.3. 指定排序的法则5.3.1. 按照文档的得分降序排序Hits hits=searcher.search(query,Sort.RELEVANCE);5.3.2. 按文档的内部ID升序排序Hits hits=searcher.search(query, Sort.INDEXORDER);5.3.3. 按照一个Field来排序Sort sort=new Sort();SortField sf=new SortField(“bookNumber”,SortField.INT,false);sort.setSort(sf);Hits hits=searcher.search(query,sort);5.3.4. 按照多个Field来排序Sort sort=new Sort();SortField sf1=new SortField(“bookNumber”,SortField.INT,false);/升序SortField sf2=new SortField(“publishdate”,SortField.STRING,true);/降序sort.setSort(new SortFieldsf1,sf2);Hits hits=searcher.search(query,sort);5.3.5. 改变SortField中的Locale信息String str1=”我”; String str2=”你”;Collator co1=Collator.getInstance(Locale.CHINA);Collator co2=Collator.getInstance(Locale.JAPAN);System.out.println(Locale.CHINA+”:”+pare(str1,str2);System.out.println(Locale.JAPAN+”:”+pare(str1,str2);输出结果为:zh_CN:1ja_JP:-1所以public SortField(String field,Locale locale)public SortField(String field,Locale locale,boolean reverse)6. 过滤器使用public Hits search(Query query,Filter filter)(1)简单过滤Hits hits=searcher.search(query,new AdvancedSecurityFilter();/过滤掉securitylevel为0的结果(2)范围过滤RangeFilter只显示中间的RangeFilter filter=new RangeFilter(“publishdate”,”1970-01-01”,”1998-12-31”,true,true”);Hits hits=searcher.search(query,filter);无上边界public static RangeFilter More(String fieldname,String lowerTerm)无下边界public static RangeFilter Less(String fieldname,String upperTerm)(3)在结果中查询QueryFilterRangeQuery q=new RangeQuery(new Term(“publicshdate”,”1970-01-01”),new Term(“publishdate”,”1999-01-01”),true);QueryFilter filter=new QueryFilter(q);Hits hits=searcher.search(query,filter);7. 分析器Analysis7.1. 自带分析器和过滤器 标准过滤器:StandardAnalyzer 大小写转换器:LowerCaseFilter 忽略词过滤器:StopFilterpublic StopFilter(TokenStream input,String stopWords)public StopFilter(TokenStream in,String stopWords,boolean ignoreCase)public StopFilter(TokenStream input,Set stopWords,boolean ignoreCase)public StopFilter(TokenStream in, Set stopWords)其中,参数TokenStream代表当前正在进行处理的流;String类型的数组代表一个用数组表示的忽略词集合;Set类型的参数与String一样,是用来表示忽略词集合的;boolean表示当与忽略词集合中的词进行匹配时,是否需要忽略大小写。 长度过滤器:LengthFilter PerFieldAnalyzerWrapper WhitespaceAnalyzerString str=str1 str2 str3;StringReader reader=new StringReader(str);Analyzer anlyzer=new WhitespaceAnalyzer();TokenStream ts=anlyzer.tokenStream(, reader);Token t=null;while( (t=ts.next()!=null )System.out.println(t.termText();7.2. 第三方过分析器 单字分词 二分法:CJKAnalyzer、中科院ICTCLAS分词、JE分词 词典分词7.2.1. JE分词用法. 示例import jeasy.analysis.MMAnalyzer;IndexWriter writer = new IndexWriter(INDEX_STORE_PATH, new MMAnalyzer(), true);String str= Lucene是一个全文检索引擎的架构,+提供了完整的查询引擎和索引引擎。Lucene以其方便使用、快 +速实施以及灵活性受到广泛的关注。它可以方便地嵌入到各种应用 +中实现针对应用的全文索引、检索功能,本总结使用lucene-2.3.2。;MMAnalyzer analyzer=new MMAnalyzer();trySystem.out.println(analyzer.segment(str, |);catch(Exception e)e.printStackTrace();输出结果:lucene|一个|全文|检索|引擎|架构|提供|完整|查询|。. 设定正向最大匹配的字数MMAnalyzer analyzer=new MMAnalyzer(4);. 添加新词MMAnalyzer.addWord(String word);MMAnalyzer.addDictionary(Reader reader);MMAnalyzer analyzer=new MMAnalyzer();MMAnalyzer.addWord(迈克尔雷第);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 DirectoryRAMDir);writer2.close();注意:在合并前一定要先关闭要加的索引器。9. 各种Query9.1. 概述query.toString()查看原子查询9.2. 使用特定的分析器搜索IndexSearcher searcher = new IndexSearcher(path );Hits hits = null;Query query = null;QueryParser parser =new QueryParser(contents, new StandardAnalyzer();query =parser.parse(11 a and hello);hits=searcher.search(query); /查找 name:11 name:hello 共1个结果System.out.println(查找 +query.toString()+ 共 + hits.length() + 个结果);9.3. 按词条搜索TermQueryQuery query = null;query=new TermQuery(new Term(name,word1 a and);hits=searcher.search(query);/ 查找 name:word1 a and 共0个结果System.ou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农发行汉中市西乡县2025秋招笔试性格测试题专练及答案
- 农发行海口市琼山区2025秋招信息科技岗笔试题及答案
- 农发行兰州市皋兰县2025秋招笔试行测高频题及答案
- 农发行内江市隆昌市2025秋招面试典型题目及参考答案
- 国家能源呼和浩特市托克托县2025秋招笔试思维策略题专练及答案
- 国家能源呼和浩特市新城区2025秋招笔试资料分析题专练及答案
- 国家能源抚州市黎川县2025秋招笔试综合知识题专练及答案
- 农村林地转让承包合同2篇
- 初三的演讲稿13篇
- 2025年潍坊诸城市市属国有企业公开招聘工作人员(9名)模拟试卷及答案详解(考点梳理)
- 量子物理发展简史教学课件
- 全国高中数学联赛
- (通桥【2018】8370)《铁路桥梁快速更换型伸缩缝安装图》
- FZ/T 80004-2014服装成品出厂检验规则
- 绿色化学4章课件
- 计量经济学-西南财大庞皓-博导
- 《海洋经济学》配套教学课件
- DBJ53-T-40-2011 云南省城镇园林工程施工质量验收规程
- 晕厥(课件)课件
- 气体灭火的施工方案
- 工程概算表【模板】
评论
0/150
提交评论