本文由美白面膜排行榜整理全文检索lucene研究1 Lucene简介Lucene是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。
Lucene以其方便使用、快速实施以及灵活性受到广泛的关注。
它可以方便地嵌入到各种应用中实现针对应用的全文索引、检索功能,本总结使用lucene3.0.02 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包相对而言比较简单,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 word2word3",Field.Store.NO,Field.Index.TOKENIZED));Document doc2 = new Document();doc2.add(new Field("name", "word1 word2word3",Field.Store.NO,Field.Index.TOKENIZED));4 Field字段以new Field("name", "word1 word2word3",Field.Store.YES,Field.Index.TOKENIZED);为例4.1 Field类的构造方法public Field(String name,String value,Store store,Index index);//直接的字符串方式public Field(String name,String value,Store store,Indexindex,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的压缩功能将其值进行压缩。
4.2 store类Store.NO:表示该Field不需要存储Store.YES:表示该Field需要存储PRESS:表示用压缩方式来保存这个Field的值4.3 ind ex类Index.NO:不需要索引Index. ANALYZED: 分词索引:会对Field的内容进行分词,只要部分词匹配该Field会被选中;Index. NOT_ANALYZED: 不分词索引:不会对Field的内容进行分词,只有全词匹配该Field才会被选中;5 IndexWriter类5.1 Ind exWriter类的构造方法public IndexWriter(Directory d,Analyzer a,Boolean create,MaxFieldLength length)public IndexWriter(Directory d,Analyzer a, MaxFieldLength mfl)IndexWriter writer=new IndexWriter(new SimpleFSDirectory(newFile(path)),new StandardAnalyzer(),true,IndexWriter.MaxFieldLength.LIMITED);第一个参数:索引存放在什么地方第二个参数:文本分析器,继承自org.apache.lucene.analysis.Analyzer 类第三个参数:是否创建新索引,为true时,IndexWriter不管目录内是否已经有索引了,一律清空,重新建立;当为false时,则IndexWriter会在原有基础上增量添加索引。
所以在更新的过程中,需要设置该值为false。
第四个参数:最大field数量5.2 添加文档public void addDocument(Document doc)public void addDocument(Document doc,Analyzer analyzer)//使用一个开发者自定义的,而非事先在构建IndexWriter时声明的Analyzer来进行分析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() + "个结果"); 5.3 删除文档IndexWriter提供四个方法删除DocumentdeleteDocuments(Term);deleteDocuments(Term[]);deleteDocuments(Query);deleteDocuments(Query[]);Term是个final的类,所以它没有任何子类//删除filename为time.txt的文档writer.deleteDocuments(new Term("filename","time.txt"));Query是个抽象类,继承于它的MultiTermQuery类也是个抽象类,而TermRangeQuery类又继承于MultiTermQuery,并且实现其所有抽象方法,所以删除文档也可以用下面这种方式:writer.deleteDocuments(newTermRangeQuery(“title”,”d”,”j”,true,true));//两个true、true分别代表了是否包含d j两点。
因为RangeQuery已经不推荐再使用,而是用TermRangeQuery和NumericRangeQuery来替代,NumericRangeQuery与RangeQuery类似,只不过是对数值进行范围检索。
5.4 更新文档更新索引提供两个方法,其实Lucene是没有办法更新的,只有先删除了再更新,方法如下updateDocument(Term, Document)首先删除所有的文档,然后用默认的文本分析器加上新的文档updateDocument(Term, Document, Analyzer)//同样是先删除所有文档,不再使用默认的分析器,使用提供的分析器加上文档5.5 性能参数1)megeFactor控制Lucene在把索引从内存写入磁盘上的文件系统时内存中最大的Document数量,同时它还控制内存中最大的Segment数量。
默认为10.writer.setMergeFactor(10);2) maxMergeDocs限制一个Segment中最大的文档数量。
writer.setMaxMergeDocs(1000);一个较大的maxMergeDocs适用于对大批量的文档建立索引,增量式的索引则应使用较小的maxMergeDocs。
3) minMergeDocs用于控制内存中持有的文档数量的,它对磁盘上的Segment大小没有任何影响。
4) maxFieldLength限制Field的长度,默认值为10000.最大值100000个。