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

Lucene小练十(八种搜索)

 
阅读更多
package Java.se.lucene;
//主类
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.Term;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;

public class Search {
	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 IndexWriter writer=null;
	private Date[] dates=null;
	private Map<String,Float> scores=new HashMap<String,Float>();
	private Directory directory=null;
	private IndexReader reader=null;
	
	public Search()
	{
		directory=new RAMDirectory();
		setDate();
		index();
	}
	//建立索引
	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();
			}
		}
	}
	//获取searcher
	public IndexSearcher getSearcher()
	{
		try {
			if(reader==null)
			{
				reader=IndexReader.open(directory);
			}else {
				IndexReader rd=IndexReader.openIfChanged(reader);
				if(reader!=null)
				{
					reader.close();
					reader=rd;
				}
			}
			return new IndexSearcher(reader);
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	//精确查找 1
	public void searchByTerm(String field,String name,int num)
	{
		try {
			IndexSearcher searcher=getSearcher();
			Query query =new TermQuery(new Term(field,name));
			TopDocs tds=searcher.search(query, num);
			System.out.println("一共查询了:"+tds.totalHits);
			for(ScoreDoc sd:tds.scoreDocs)
			{
				Document doc=searcher.doc(sd.doc);
				System.out.println(doc.get("id")+"-->"+doc.get("name")+".."
						+"["+doc.get("email")+"]"+"("+doc.get("content")+")"+
						"-->"+doc.get("attach")+".."+doc.get("date"));				
			}
						
			searcher.close();
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//范围查询 2
	public void searchByTermRange(String field,String start,String end,int num){
	
			try {
				IndexSearcher searcher=getSearcher();
				Query query =new TermRangeQuery(field, start, end, true, true);
				TopDocs tds=searcher.search(query, num);
				System.out.println("一共查询了:"+tds.totalHits);
				for(ScoreDoc sd:tds.scoreDocs)
				{
					Document doc=searcher.doc(sd.doc);
					System.out.println(doc.get("id")+"-->"+doc.get("name")+".."
							+"["+doc.get("email")+"]"+"("+doc.get("content")+")"+
							"-->"+doc.get("attach")+".."+doc.get("date"));				
				}			
				searcher.close();
			} catch (CorruptIndexException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
	//范围查询 3
	public void searchByNumRange(String field,int start,int end,int num){
	
			try {
				IndexSearcher searcher=getSearcher();
				Query query =NumericRangeQuery.newIntRange(field, start, end, true,true);
				TopDocs tds=searcher.search(query, num);
				System.out.println("一共查询了:"+tds.totalHits);
				for(ScoreDoc sd:tds.scoreDocs)
				{
					Document doc=searcher.doc(sd.doc);
					System.out.println(doc.get("id")+"-->"+doc.get("name")+".."
							+"["+doc.get("email")+"]"+"("+doc.get("content")+")"+
							"-->"+doc.get("attach")+".."+doc.get("date"));				
				}			
				searcher.close();
			} catch (CorruptIndexException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
	//前缀搜索 4
	public void searchByPrefix(String field,String value,int num)
	{
		try {
			IndexSearcher searcher=getSearcher();
			Query query =new PrefixQuery(new Term(field,value));
			TopDocs tds=searcher.search(query, num);
			System.out.println("一共查询了:"+tds.totalHits);
			for(ScoreDoc sd:tds.scoreDocs)
			{
				Document doc=searcher.doc(sd.doc);
				System.out.println(doc.get("id")+"-->"+doc.get("name")+".."
						+"["+doc.get("email")+"]"+"("+doc.get("content")+")"+
						"-->"+doc.get("attach")+".."+doc.get("date"));				
			}			
			searcher.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//通配搜索 5
	public void searchBywildCard(String field,String value,int num)
	{
		try {
			IndexSearcher searcher=getSearcher();
			//通配符操作符,?可以匹配一个通配符,*可以匹配多个通配符
			Query query =new WildcardQuery(new Term(field,value));
			TopDocs tds=searcher.search(query, num);
			System.out.println("一共查询了:"+tds.totalHits);
			for(ScoreDoc sd:tds.scoreDocs)
			{
				Document doc=searcher.doc(sd.doc);
				System.out.println(doc.get("id")+"-->"+doc.get("name")+".."
						+"["+doc.get("email")+"]"+"("+doc.get("content")+")"+
						"-->"+doc.get("attach")+".."+doc.get("date"));				
			}			
			searcher.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//Boolean查询 6
	public void searchByBoolean(int num)
	{
       try {
			IndexSearcher searcher=getSearcher();
			//通配符操作符,?可以匹配一个通配符,*可以匹配多个通配符
			Query query = new BooleanQuery();
			((BooleanQuery) query).add(new TermQuery(new Term("name", "laona")),Occur.MUST);
			((BooleanQuery) query).add(new TermQuery(new Term("content", "fdfs")),Occur.SHOULD);
			TopDocs tds=searcher.search(query, num);
			System.out.println("一共查询了:"+tds.totalHits);
			for(ScoreDoc sd:tds.scoreDocs)
			{
				Document doc=searcher.doc(sd.doc);
				System.out.println(doc.get("id")+"-->"+doc.get("name")+".."
						+"["+doc.get("email")+"]"+"("+doc.get("content")+")"+
						"-->"+doc.get("attach")+".."+doc.get("date"));				
			}			
			searcher.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//短语查询 7
	public void searchByPhrase(int num)
	{
       try {
			IndexSearcher searcher=getSearcher();
			//通配符操作符,?可以匹配一个通配符,*可以匹配多个通配符
			PhraseQuery query = new PhraseQuery();
			query.setSlop(1);
			query.add(new Term("content","i"));
			query.add(new Term("content","fdsfsd"));
			TopDocs tds=searcher.search(query, num);
			System.out.println("一共查询了:"+tds.totalHits);
			for(ScoreDoc sd:tds.scoreDocs)
			{
				Document doc=searcher.doc(sd.doc);
				System.out.println(doc.get("id")+"-->"+doc.get("name")+".."
						+"["+doc.get("email")+"]"+"("+doc.get("content")+")"+
						"-->"+doc.get("attach")+".."+doc.get("date"));				
			}			
			searcher.close();
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//模糊查询  8
	public void searchByFuzzy(int num)
	{
       try {
			IndexSearcher searcher=getSearcher();
			//通配符操作符,?可以匹配一个通配符,*可以匹配多个通配符
			Query query = new FuzzyQuery(new Term("name","laonaa"),0.5f);
			TopDocs tds=searcher.search(query, num);
			System.out.println("一共查询了:"+tds.totalHits);
			for(ScoreDoc sd:tds.scoreDocs)
			{
				Document doc=searcher.doc(sd.doc);
				System.out.println(doc.get("id")+"-->"+doc.get("name")+".."
						+"["+doc.get("email")+"]"+"("+doc.get("content")+")"+
						"-->"+doc.get("attach")+".."+doc.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
		}
    } 
}
/测试类
package Java.se.lucene;

import org.junit.Before;
import org.junit.Test;

public class Test_Search {
	private static final int num=10;
	private Search search=null;
	
	@Before
	public void init()
	{
	   search=new Search();	
	}
	@Test
	public void test_search01()
	{
		search.searchByTerm("content", "like", 6);
	}
	@Test
	public void test_search02()
	{
		//查询(内容--content) 范围(a-z)
		search.searchByTermRange("content","a","z",10);
		//查询(内容--name) 范围(a-z)
		search.searchByTermRange("content","a","z",10);
		//查询(内容--attach) 范围(a-z) 查询不出
		search.searchByTermRange("attach","2","6",10);
	}
	@Test
	public void test_search03()
	{
		//查询(内容--content) 范围(a-z)
		search.searchByNumRange("attach",1,4,num);
	
	}
	@Test
	public void test_search04()
	{
		//查询(内容--content) 
		search.searchByPrefix("content","lgfdfg",num);
	
	}
	@Test
	public void test_search05()
	{
		search.searchBywildCard("email","aa**",num);
	}
	@Test
	public void test_search06()
	{
		search.searchByBoolean(num);
	}
	@Test
	public void test_search07()
	{
		search.searchByPhrase(num);
	}
	@Test
	public void test_search08()
	{
		search.searchByFuzzy(num);
	}
//	public static void main(String[] args) {
//		Search search=new Search();
//		search.searchByTerm("name", "mike", 3);
//	}

}


分享到:
评论

相关推荐

    适合练手、课程设计、毕业设计的Java项目源码:公交搜索系统(java结合lucene).rar

    适合练手、课程设计、毕业设计的Java项目源码:公交搜索系统(java结合lucene).rar 适合练手、课程设计、毕业设计的Java项目源码:公交搜索系统(java结合lucene).rar 适合练手、课程设计、毕业设计的Java项目源码...

    盘古PanGu4Lucene_V2.3.1.0

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

    lucene je-analysis jar包

    同时,Lucene还支持多字段搜索、模糊搜索、短语搜索等多种查询模式,大大提升了搜索效率。 接下来,我们关注JE-Analysis。JE-Analysis是针对Java环境的中文分词工具,它是基于Lucene进行扩展和优化的,特别适合处理...

    训练 Word2Vec 模型或 LSA 模型,并在 Solr\Lucene 中实现概念搜索\语义搜索_python

    用于构建“概念搜索引擎”的存储库,作者 Simon Hughes(Dice 数据科学家)。该存储库包含用于在一组文档上训练 Thomas Mikolov 的 Word2Vec 模型的 Python 代码。然后可以使用同义词文件结合一些 solr 插件将这个...

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

    - Lucene是一种高性能的全文检索引擎,支持复杂的查询语法。 - 索引结构包括倒排索引等,能够高效地处理大量文本数据。 - **2.2.3 Lucene全文检索引擎** - Lucene是Apache基金会的一个开源项目,提供了强大的...

    全文索引引擎Lucene简单教程

    Lucene通过建立反向索引机制来提高搜索效率,其索引机制将文档转换成一系列关键词及其对应的文档ID,这种机制极大地提升了搜索速度和准确性。 #### Lucene的特点 - **灵活性**:Lucene提供了高度灵活的配置选项,...

    lucene中文检索

    Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了一套高级的索引和搜索功能,使得开发者能够轻松地在应用程序中实现复杂的全文检索。Lucene 可以处理各种语言的文本,包括中文,而中文检索是...

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

    Lucene是一个流行的全文检索库,广泛应用于信息检索、搜索引擎开发等领域。在这个项目中,开发者可能已经实现了自定义的分词策略,通过分析文本中的局部统计特性来优化分词效果,特别是针对中文这种无明显空格分隔的...

    藏经阁-FUSING APACHE SPARK AND LUCENE FOR NEAR-REALTIME PREDICTIVE

    Apache Spark和Lucene是两个在数据处理和搜索领域极具影响力的开源工具。Apache Spark以其分布式计算的强大性能和易用性,成为大数据处理的首选平台;而Lucene则因其高效的全文检索能力在数据检索方面独树一帜。本文...

    基于lucene搜索引擎的jsp服务器端,带智能提示.zip

    【适合场景】:相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可基于此项目来扩展开发...

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

    Java技术在搜索引擎中的应用主要体现在分布式搜索引擎开发上,如Nutch和Lucene等开源项目。Nutch是一款由Java编写的高性能、可扩展的搜索引擎,它利用Lucene库进行索引和搜索。Nutch的设计目标是处理海量网页数据,...

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

    mmseg4j是一款高效、灵活的Java实现的中文分词工具,而Lucene则是一个强大的全文搜索引擎库。当两者结合时,可以为中文文本的索引和搜索提供强大支持。本文将详细介绍mmseg4j和Lucene5.x的基本概念,以及如何将它们...

    深度学习搜索引擎开发-Java实现-源代码.zip

    深度学习搜索引擎是一种融合了深度学习技术的现代搜索引擎,它能够通过理解自然语言、识别语义关系和模式,为用户提供更为精确和个性化的搜索结果。在Java环境下开发深度学习搜索引擎,可以利用Java的强大功能和丰富...

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

    首先,读取查询图片的特征向量,然后在Lucene索引中进行搜索,找到与查询向量最接近的图片特征向量。根据选择的距离度量(例如余弦相似度),计算并返回最相似的图片。 6. **优化和扩展**:为了提高效率,可以考虑...

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

    在IT领域,特别是数据检索和图像处理方面,反向图像搜索引擎是一种高级技术,它允许用户通过上传图片来寻找与其相似的图像。SmartSearch是这样一个系统,它利用了TensorFlow的深度学习能力以及Elasticsearch的强大...

    MMAnalyzer分词jar包

    `lucene-core-2.4.1.jar`是Apache Lucene的核心库,Lucene是一个全文搜索引擎框架。尽管MMAnalyzer并不直接依赖于Lucene进行分词,但许多使用MMAnalyzer的项目可能会结合Lucene来构建全文检索系统。Lucene提供了一套...

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

    在这个过程中,Lucene是一个非常重要的工具,它是一个高性能、全文检索库,由Java编写,广泛应用于搜索引擎的构建。 Lucene的核心功能包括文档索引、搜索和排序。在索引阶段,它会解析网页内容,提取关键词,并建立...

    yifanyang-search_recommend-master_Recommend_java_搜索推荐_

    Elasticsearch(ES)是一个开源的全文搜索引擎,基于Lucene构建,提供了分布式、实时、可扩展的搜索和分析功能。在版本7中,Elasticsearch增强了性能、稳定性和易用性。 1. **分布式架构**:ES采用分布式架构,可以...

Global site tag (gtag.js) - Google Analytics