之前说到,lucene简单的建立索引,并根据索引进行简单的搜索功能。下面来探讨一下对lucene索引的管理,也就是对索引的增删查改,其它不多说,直接贴代码:
(ps:因为在学习lucene的时候,全部笔记都作为注释写到代码了,所以贴出代码后也不多说了,望谅解)
package lucene; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.Term; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class IndexUtil { private String[] ids={"1","2","3","4","5","6"}; private String[] emails={"sam@163.com","holiday@163.com","issac@163.com","summer@163.com","coco@163.com","roy@163.com"}; private String[] contents={"hello,how are you","hi,I am fine!","what is your name","my name is summer","what is your number","I will tell you,just wait a minute"}; private String [] names={"sam","holiday","issac","summer","coco","roy"}; private int[] attachs={2,3,2,4,5,7}; private Directory directory=null; public Directory getDirectory() { return directory; } public void setDirectory(Directory directory) { this.directory = directory; } public IndexUtil() throws IOException { directory=FSDirectory.open(new File("E:/lucene/index02")); } /** * 建立索引 * @throws IOException */ public void index() throws IOException { IndexWriter indexWriter=new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_43,new StandardAnalyzer(Version.LUCENE_43))); for(int i=0;i<ids.length;i++) { Document document=new Document(); document.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS)); document.add(new Field("email",emails[i],Field.Store.YES,Field.Index.NOT_ANALYZED)); document.add(new Field("name",names[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS)); document.add(new Field("content",contents[i],Field.Store.NO,Field.Index.ANALYZED)); indexWriter.addDocument(document); } if(indexWriter!=null) indexWriter.close(); } /** * 查询索引的信息 * @throws IOException */ public void query() throws IOException { IndexReader indexReader=IndexReader.open(directory); //通过IndexReader,可以获取有效文档的个数,还有一些其它的操作 System.out.println("实际文档数numdocs:"+indexReader.numDocs()); System.out.println("全部文档数maxdoc(包括回收站的文档):"+indexReader.maxDoc()); System.out.println("被删除的文档(被放到回收站里):"+indexReader.numDeletedDocs()); indexReader.close(); } public void delete() throws IOException { IndexWriter indexWriter=new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_43,new StandardAnalyzer(Version.LUCENE_43))); //这里的参数可以是一个Query,也可以是一个term //1、当参数为Query时,可以传入一个Query对象,它会根据你传入的query对象,把符合这个查找条件的文档都删掉,例如:如果你传入的Query是content域中,包含字母‘a’的,那么所有包含字符‘a’的文档都会被删掉 //2、当传入的是一个term时,这个算是一个精确查找,它是一个‘像’,怎么理解呢,比如,下面的Term("id","1")它就是id为1的像,也就是,它会找到id为1的索引文档 //需要注意的一点是,这个删除并不是真正的删除,它会把这个文档放到回收站里 indexWriter.deleteDocuments(new Term("id","1")); //rollback()函数,当indexWriter没有commit之前,它是可以回滚回之前没有修改的状态, //indexWriter.rollback(); //indexWriter不提交或者不关闭,它所进行的修改时不会起效的 indexWriter.close(); } /*在版本3.6之后,已经没有了unDeleteAll()方法了 * public void recoverDelete() throws IOException { IndexWriter indexWriter =new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_43,new StandardAnalyzer(Version.LUCENE_43))); }*/ /** * 强制删除,意思就是清空回收站 * @throws IOException */ public void forceDelete() throws IOException { IndexWriter indexWriter=new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_43,new StandardAnalyzer(Version.LUCENE_43))); indexWriter.forceMergeDeletes(); indexWriter.close(); } /** * 强制合并,把几段合并成x段,x为设置的参数 * @throws IOException */ public void forceMerge() throws IOException { IndexWriter indexWriter=new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_43,new StandardAnalyzer(Version.LUCENE_43))); //强制合并,把几段合并成x段,x为设置的参数,这里是强制合并为两段 //在合并的过程中,例如合并成两段,通常都是将第一段不作任何改变的作为第一段,后面的全部合并成一段,在这合并的过程中,它会把回收站也清空掉(这里不影响第一段的结果),如果合并成三段,那么就将第一、二段不作任何改变作为第一、二段,其余的合并成一段,以此类推 //合并之后,实际的文档数是不变的,变的只是总的文档数,也就是回收站的数量变而已 //注意:这里在lucene3.5之后不建议使用,因为会消耗大量的开销,因为lucene在段数达到一定的情况下,会自动处理的 indexWriter.forceMerge(3); indexWriter.close(); } /** * 更新索引 * @throws IOException */ public void update() throws IOException { IndexWriter indexWriter=new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_43,new StandardAnalyzer(Version.LUCENE_43))); Document document=new Document(); document.add(new Field("id","10",Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS)); document.add(new Field("email",emails[0],Field.Store.YES,Field.Index.NOT_ANALYZED)); document.add(new Field("name",names[0],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS)); document.add(new Field("content",contents[0],Field.Store.NO,Field.Index.ANALYZED)); //这里的更新,从方法上可以看出,它实际上时将旧的删除,然后添加一个新文档的进去,将匹配到term的文档删除,然后就新的document添加进去 indexWriter.updateDocument(new Term("id","1"), document); indexWriter.close(); } }
下面写个测试类:
package test; import java.io.IOException; import lucene.IndexUtil; import org.junit.Test; public class TestIndex { @Test public void testIndex() throws IOException { IndexUtil indexUtil=new IndexUtil(); indexUtil.index(); } @Test public void testQuery() throws IOException { IndexUtil indexUtil=new IndexUtil(); indexUtil.query(); } @Test public void testDelete() throws IOException { IndexUtil indexUtil=new IndexUtil(); indexUtil.delete(); } /*此方法已经不能用了 * @Test public void testRecoverDelete() throws IOException { IndexUtil indexUtil=new IndexUtil(); indexUtil.recoverDelete(); }*/ @Test public void testForceDelete() throws IOException { IndexUtil indexUtil=new IndexUtil(); indexUtil.forceDelete(); } @Test public void testForceMerge() throws IOException { IndexUtil indexUtil=new IndexUtil(); indexUtil.forceMerge(); } @Test public void testUpdate() throws IOException { IndexUtil indexUtil=new IndexUtil(); indexUtil.update(); } }
因为方法有点多,所以测试结果就不贴出来了。OK,到这里,索引的增删查改也完了,整体来说还是比较简单容易理解的。
ps:下面增加一个小知识,希望对大家有用
Field.Store.YES或者NO(存储域选项) 设置为YES表示或把这个域中的内容完全存储到文件中,方便进行文本的还原 设置为NO表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完全还原(doc.get) Field.Index(索引选项) Index.ANALYZED:进行分词和索引,适用于标题、内容等 Index.NOT_ANALYZED:进行索引,但是不进行分词,如果身份证号,姓名,ID等,适用于精确搜索 Index.ANALYZED_NOT_NORMS:进行分词但是不存储norms信息,这个norms中包括了创建索引的时间和权值等信息 Index.NOT_ANALYZED_NOT_NORMS:即不进行分词也不存储norms信息 Index.NO:不进行索引 (一个域除了能够被索引,还能够被存储,仅仅被存储的域是搜索不到的,但是能通过文档号查到,多用于不想被搜索到,但是在通过其它域能够搜索到的情况下,能够随着文档号返回给用户的域)
相关推荐
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...
在IT领域,Lucene是一个非常著名的全文搜索引擎库,由Apache软件基金会开发。它提供了一个可扩展的、高性能的搜索框架,使得开发者能够轻松地在应用程序中实现全文检索功能。在"lucene4.3 按坐标距离排序"这个主题中...
lucene4.3增删改查的的一个工具类,对新手来说是一份不可多得的入门资料。
1.XunTa是在lucene4.3上创建的通过“知识点”来找人的搜人引擎。 输入一个关键词(或组合),XunTa返回一个排名列表,排在前面的人是与该关键词(组合)最相关的“达人”。 可访问 http://www.xunta.so立即体验...
总的来说,基于Lucene的中型搜索引擎(C#)结合了开源的全文检索库和C#语言的优势,为企业或个人开发自定义搜索引擎提供了一种高效且灵活的解决方案。通过深入理解Lucene的原理和ShootSearch的优化策略,开发者可以...
Lucene是由Apache软件基金会提供的一个开源的全文搜索引擎库,它为用户提供了一组用Java编写的索引和搜索程序库。它具备高性能、可扩展性强的特点,可以用来构建各种搜索引擎应用。Lucene使用倒排索引,能够快速准确...
这个“lucene增删改查小demo”涵盖了 Lucene 搜索库的基础操作,通过 IndexWriter 进行索引管理,使用 QueryParser 构建查询,IndexSearcher 执行查询,并通过 Document 实现数据的读写。掌握这些基本操作后,你可以...
本项目“基于Lucene的桌面搜索引擎”正是针对这一需求,利用开源全文搜索引擎库Lucene实现了一个桌面级别的搜索解决方案。 **一、Lucene简介** Lucene是Apache软件基金会的一个开放源代码项目,它是Java语言编写的...
全文检索lucene 4.3 所用到的3个jar包,包含lucene-queryparser-4.3.0.jar、 lucene-core-4.3.0.jar、lucene-analyzers-common-4.3.0.jar。
Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了一个简单的API来索引和搜索大量文本数据。Heritrix,另一方面,是一个开源的互联网档案爬虫,能够系统地抓取网页并保存为离线资源,以便于后续...
《基于Lucene的全文搜索引擎设计》 全文搜索引擎是现代网络信息检索的重要工具,它通过自动化的方式,高效地从海量的Web数据中检索出用户需要的信息。本设计主要围绕基于JavaWeb平台,使用Lucene框架构建的全文搜索...
本文将深入探讨如何使用Apache LUCENE这一强大的全文搜索引擎库,设计并实现一个高效的搜索引擎。LUCENE是一款开源的Java库,它为开发者提供了构建搜索引擎所需的核心功能,包括索引创建、文本分析、查询解析以及...
《Lucene+Nutch搜索引擎开发:王学松源代码解析》 在信息技术日新月异的今天,搜索引擎已经成为了人们获取信息的重要工具。Lucene和Nutch是两个在开源社区广泛使用的搜索引擎技术,它们为开发者提供了构建高效、可...
在本项目实践中,我们将深入探讨如何利用开源工具Lucene构建一个全文搜索引擎,这是《信息检索》课程中的一个重要任务。Lucene是Apache软件基金会的一个高性能、全文本搜索库,它为开发人员提供了强大的文本搜索功能...
总结来说,这个基于Lucene的小型搜索引擎项目涵盖了网络爬虫、数据处理、全文搜索引擎和前端开发等多个环节。通过Heritrix爬取数据,利用Lucene建立高效索引,JSP实现交互界面,形成了一套完整的搜索引擎系统。这样...
在"Lucene全文搜索_LuceneJava全文搜索_"这个主题中,我们将深入探讨Lucene如何在Java环境中实现高效的全文搜索引擎。首先,Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)和搜索(Search)。...