`
smallearth
  • 浏览: 37449 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Lucene小练八(实现了索引和搜索)

 
阅读更多
//主类

package Java.se.lucene;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericField;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.StaleReaderException;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;


public class index {
	private String[] ids={"1","2","3","4","5","6"};
	private String[] emails={"aa@aa.com","bb@bb.com",
			"cc@cc.com","dd@dd.com","ee@ee.com","ff@ff.com"};
	private String[] contents={"i like  gdsfgfds","i like fsdfs","i like fdsfsd",
			"i like fdsfsd","i like like fdfs","i like like like fsefsdfg"};
	private int[] attachs={1,2,3,4,5,6};
	private String[] names={"liwu","zhangsan","xiaoqinag","laona",
			"dabao","lisi"};
	private Directory directory=null;
	private IndexWriter writer=null;
	private Date[] dates=null;
	private Map<String,Float> scores=new HashMap<String,Float>();
	private static IndexReader reader=null;
	
	public index()
	{
		setDate();//创建日期
		try {
			scores.put("aa.com", 2.0f);
			scores.put("bb.com", 1.0f);
			scores.put("cc.com", 3.0f);
			scores.put("dd.com", 4.0f);
			scores.put("ee.com", 5.0f);
			scores.put("ff.com", 6.0f);
		  // directory=new RAMDirectory();//从内存打开Directory
		    Index();
		//从硬盘打开Directory
		    directory=FSDirectory.open(new File("f:/lucene/Index04"));
		//	reader=IndexReader.open(directory);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//建立索引
	public void Index()
	{
		Document document=null;
         try {
			writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36,
				new StandardAnalyzer(Version.LUCENE_36)));
			writer.deleteAll();//更新索引
			for(int i=0;i<ids.length;i++)
			{
				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("content", contents[i], 
						Field.Store.YES, Field.Index.ANALYZED));
				document.add(new Field("name",names[i],
						Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
		    	//为数字添加索引
				document.add(new NumericField("attach", Field.Store.YES,true).
						setIntValue(attachs[i]));
				//为日期添加索引
				document.add(new NumericField("date", Field.Store.YES,true)
				.setLongValue(dates[i].getTime()));//记住要getTime
						
				
		    	String str=emails[i].substring(emails[i].lastIndexOf("@")+1);
		    	System.out.println(str);
    		    if(scores.containsKey(str))
		    	{
		    		document.setBoost(scores.get(str));
		    	}else{
	    		document.setBoost(0.5f);
		    	}
		    	writer.addDocument(document);
		    	writer.commit();//提交writer
			}
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
            try {
				writer.close();
			} catch (CorruptIndexException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
    //遍历各种视频 
	public void query()
	{
		try {
			IndexReader reader=IndexReader.open(directory);
			System.out.println("numdocs:"+reader.numDocs());//文档总数
			System.out.println("maxDocs:"+reader.maxDoc());//可存储文章做大数目
			System.out.println("detelemaxDocs:"+reader.numDeletedDocs());
			reader.close();
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	 //用writer删除索引,但并没有完全删除,可以恢复的
	public void delete01()
	{
		try {
			writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36,
					new StandardAnalyzer(Version.LUCENE_36)));
			writer.deleteDocuments(new Term("id","1"));
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				writer.close();
			} catch (CorruptIndexException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	//用reader来删除

	//使用reader进行恢复
	@SuppressWarnings("deprecation")
	public void undelete()
	{
		IndexReader reader = null;
			try {
				reader = IndexReader.open(directory,false);
				reader.undeleteAll();
				reader.close();
			} catch (StaleReaderException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (CorruptIndexException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (LockObtainFailedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
	//清空回收站
	public void forceDelete()
	{
		try {
			writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36,
					new StandardAnalyzer(Version.LUCENE_36)));
			writer.forceMergeDeletes();
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				writer.close();
			} catch (CorruptIndexException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
    //已经停用
    public void forceMerge()
    {
    	try {
			writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36,
					new StandardAnalyzer(Version.LUCENE_36)));
			writer.forceMerge(3);
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				writer.close();
			} catch (CorruptIndexException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
    }
    //更新索引
    public void update()
    {
    	Document document=null;
        try {
			writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36,
				new StandardAnalyzer(Version.LUCENE_36)));
			/*
			 * lucene没有提供更新,只能先删除再添加
			 * 
			 */
			for(int i=0;i<ids.length;i++)
			{
				document=new Document();
				document.add(new Field("id", "11", 
						Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS  ));
				document.add(new Field("email",emails[0],
						Field.Store.YES,Field.Index.ANALYZED));
				document.add(new Field("content", contents[0], 
						Field.Store.NO, Field.Index.NOT_ANALYZED));
				document.add(new Field("name",names[0],
						Field.Store.YES,Field.Index.NOT_ANALYZED));
		    	writer.updateDocument(new Term("id","1"), document);
			}
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
           try {
				writer.close();
			} catch (CorruptIndexException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
    }
    //搜索 
    public void search01() 
    {
    	IndexReader reader=null;
		try { 	
			reader = IndexReader.open(directory);
			IndexSearcher searcher=new IndexSearcher(reader);
			TermQuery query=new TermQuery(new Term("content","like"));
			TopDocs tds =searcher.search(query, 10);
			for(ScoreDoc sdc:tds.scoreDocs)
			{
				Document document=searcher.doc(sdc.doc);
				System.out.println("("+sdc.doc+")"+document.get("name")+"["+document.get("email")+
						"]-->"+document.get("id")+"..."+document.get("attach")+"..."+document.get("date"));
			}
			reader.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    }
    
    public void search02() 
    {
    	//IndexReader reader=null;
		try { 	
			//reader = IndexReader.open(directory);
		    IndexSearcher searcher=getSearcher();
			TermQuery query=new TermQuery(new Term("content","like"));
			TopDocs tds =searcher.search(query, 10);
			for(ScoreDoc sdc:tds.scoreDocs)
			{
				Document document=searcher.doc(sdc.doc);
				System.out.println("("+sdc.doc+")"+document.get("name")+"["+document.get("email")+
						"]-->"+document.get("id")+"..."+document.get("attach")+"..."+document.get
						("date"));
			}
	        searcher.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    }
    //创建日期
    public void setDate()
    {
    	SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-kk");
    	try {
    		dates=new Date[ids.length];
        	dates[0]=sdf.parse("2010-08-17");
        	dates[1]=sdf.parse("2011-02-17");
        	dates[2]=sdf.parse("2012-03-17");
        	dates[3]=sdf.parse("2011-04-17");
        	dates[4]=sdf.parse("2012-05-17");
        	dates[5]=sdf.parse("2011-07-17");
		} catch (Exception e) {
			e.printStackTrace();
			// TODO: handle exception
		}
    } 
   //创建Searcher
    public IndexSearcher getSearcher()
    {
    	try {
			reader=IndexReader.open(directory);
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

    	return(new IndexSearcher(reader));
     }
	
    
 }
//测试类

package Java.se.lucene;


import org.junit.Test;

public class Test_Index {
	@Test
	public void test_index() //测试索引
	{
		index ind=new index();
		ind.Index();
	}
	@Test
	public void test_query() //遍历
	{
		index ind=new index();
		ind.query();
	}
	@Test
	public void test_delete01() //删除索引
	{
		index ind=new index();
		ind.delete01();
	}

	@Test
	public void test_undelete() //恢复删除
	{
		index ind=new index();
		ind.undelete();
	}
	@Test
	public void test_forceDelete() //清空回收站站
	{
		index ind=new index();
		ind.forceDelete();
	}
	@Test
	public void test_forceMerge() //清空回收站站
	{
		index ind=new index();
		ind.forceMerge();
	}
	@Test
	public void test_update() //更新索引
	{
		index ind=new index();
		ind.update();
	}
	@Test
	public void test_search01() //更新索引
	{
		index ind=new index();
		ind.search01();
	}
	@Test
	public void test_search02() //更新索引
	{
		index ind=new index();
		for(int i=0;i<5;i++)
		{
			 ind.search02();
			 System.out.println("------------------------");
			  try {
				Thread.sleep(5000);	
			} catch (InterruptedException e) {
				e.printStackTrace();
			}	 
		}
	}
		

/*	public void check() throws IOException{						//检查索引是否被正确建立(打印索引)
		Directory directory = FSDirectory.open(new File("f:/lucene/Index04/"));//创建directory,其储存方式为在
		IndexReader reader = IndexReader.open(directory);
		for(int i = 0;i<reader.numDocs();i++){
			System.out.println(reader.document(i));
		}
		reader.close();
	}
		public static void main(String[] args) throws IOException {
			new index().check();
		}*/
}

分享到:
评论

相关推荐

    lucene je-analysis jar包

    Lucene是Apache软件基金会的一个项目,它是一个高性能、全文本搜索库,提供了一个简单的API,开发者可以利用这个API在自己的应用程序中实现全文索引和搜索功能。Lucene包含了索引、搜索、分词、排序、高亮、相关性等...

    盘古PanGu4Lucene_V2.3.1.0

    PanGu4Lucene是盘古分词为Lucene.NET定制的版本,使得Lucene.NET用户可以方便地集成中文分词功能,从而提升搜索质量和用户体验。 Lucene.NET是Apache Lucene项目的一个.NET版本,是一个高性能、全功能的全文检索库...

    一个专业搜索公司关于lucene+solar资料(1)

    ### Lucene+Solor知识点概述 #### 一、搜索引擎基础理论 **1.1 Google神话** - **起源与发展:** - Google成立于1998年,由Larry Page...- 本章详细介绍了如何使用Lucene创建和管理索引库,包括索引库的设计、创建...

    lucene中文检索

    它提供了一套高级的索引和搜索功能,使得开发者能够轻松地在应用程序中实现复杂的全文检索。Lucene 可以处理各种语言的文本,包括中文,而中文检索是 Lucene 在处理中文文本时的一个关键应用。 **中文检索的挑战** ...

    搜索opensearch model索引

    - **分片和副本**:通过在多个节点上分配索引的分片,可以实现数据和模型的分布式存储和并行处理。副本可以提供冗余,提高系统的可用性和容错能力。 - **生命周期管理**:设置索引生命周期策略(ILM),自动管理...

    引入局部统计识别高频词汇的Lucene中文分词程序src.rar

    标题中的“引入局部统计识别高频...这对于理解自然语言处理(NLP)中的分词技术,特别是对于提升在大数据环境下的搜索和索引性能具有实际意义。此外,对于学习和扩展Lucene的开发者来说,这是一个有价值的参考资料。

    相似图片搜索原理的Java实现源码范例和详细说明(由浅入深,深度解读在资料后半部分)(合集).docx

    Java提供了丰富的库(如TensorFlow和Lucene)来支持这些操作,使得开发者能够在Java环境中实现高效且准确的相似图片搜索系统。深入理解这些原理和技术,有助于开发更复杂的图像处理应用,满足多样化的需求。

    中文分词器(mmseg4j + luncene5.X)源码+jar包

    Lucene是一个高性能、全文本搜索库,提供了索引和搜索功能。在Lucene5.x版本中,引入了更高效的倒排索引结构和查询优化策略,增强了对多语言的支持,包括对中文的处理。Lucene允许开发者自定义分词器,这就为mmseg4j...

    JAVA技术与人工智能在搜索引擎上的应用_IT168文库.pdf

    Nutch是一款由Java编写的高性能、可扩展的搜索引擎,它利用Lucene库进行索引和搜索。Nutch的设计目标是处理海量网页数据,提供高效、精准的信息检索服务。 Java编程语言因其强大的跨平台能力(可移植性)而被广泛...

    电力视频大数据分布式检索系统设计与实现.pdf

    Lucene是一个高效的文本搜索引擎库,它能够快速地建立索引,提供快速的全文搜索。通过Lucene,系统不仅能够实现快速的视频检索,还能够支持复杂的查询操作,如关键词搜索、范围查询等。 整个系统的最终实现结果是一...

    网页处理与去噪-信息检索

    在提供的压缩包文件中,"luenceTestOne"和"LuenceTestTwo"可能是两个不同的Lucene应用示例,它们可能包含了创建索引、执行搜索的代码实现。而"Searcher"很可能是一个具体的搜索类,用于执行查询操作,可能包括查询...

    由弹性搜索和张量流 驱动的反向图像搜索引擎_python

    Elasticsearch是一个基于Lucene的分布式、RESTful搜索和分析引擎,它可以存储和索引大量数据,并且能够在极短的时间内提供快速的搜索结果。在反向图像搜索引擎中,Elasticsearch可能被用来存储这些由TensorFlow生成...

    ElasticSearch+Spark 构建高相关性搜索服务,千人千面推荐系统

    在构建高相关性搜索服务时,Elasticsearch的角色是快速、高效地处理海量数据的检索请求,并通过丰富的查询语法和评分机制,实现精确的搜索结果排序。 **Spark:大数据处理框架** Apache Spark是一个通用的大数据...

    贝壳找房搜索架构演进.pdf

    在2015年至2016年间,贝壳搜索的初步构建主要基于Apache Lucene技术,形成了独立的索引服务和搜索服务。然而,V1阶段存在诸多问题,如功能复用性差、接口不统一、调用混乱、扩展性不足等。这些问题限制了搜索系统的...

    基于ElasticSearch + Spark的门店智能搜索和推荐系统.zip

    ElasticSearch是一款分布式、实时的搜索和分析引擎,其基于Lucene构建,提供了全文搜索、结构化搜索以及数据分析等功能。在本项目中,ElasticSearch主要负责存储和索引门店信息,如门店名称、地址、评价等,通过其...

    计算机课程毕设:基于ElasticSearch+Spark 构建高相关性搜索服务&千人千面推荐系统.zip

    标题中的“计算机课程毕设:基于ElasticSearch+Spark 构建高相关性搜索服务&千人千面推荐系统”揭示了本项目的核心内容,它是一个结合了ElasticSearch和Spark技术来实现高效搜索引擎和个性化推荐系统的实际项目。...

    study_jh.rar

    Lucene提供了一个简单的API,开发者可以利用它来在应用程序中实现全文索引和搜索功能。Lucene支持倒排索引、布尔查询、模糊查询等多种高级搜索特性。学习Lucene有助于提升应用程序的搜索体验,特别是对于处理大量...

    新浪滚动新闻检索与分类1

    - `lucene` 包使用 **Apache Lucene** 创建文本搜索索引。 - `utils` 包提供通用函数和数据库操作。 - `offlineApp.java` 是此子模块的入口点,执行不同任务。 - `com` 子模块基于 **Spring Boot** 和 **...

Global site tag (gtag.js) - Google Analytics