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

Lucene小练四——为数字和日期添加索引

 
阅读更多
//主程序
package org.se.lucene;


import java.io.File;
import java.io.IOException;
//import java.sql.Date;
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.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.util.Version;

public class lucene_index {
		private String[] ids={"1","2","3","4","5","6"};
		private String[] emails={"welcometotyu","hellowboy",
				"higirl","howareyou","googluck","badgosh"};
		private String[] contents={"I like 1","I like 2","I like 3","I like 4" +
				"I like 5"};
		private int[] attachs={1,2,3,4,5,6};
		private String[] names={"liwu","zhangsan","xiaoqinag","laona",
				"dabao","lisi"};
		private Date[] dates=null;
		private Directory directory=null;
		private Map<String,Float> scores=new HashMap<String, Float>();
	
		
		public void index()
		{
			   IndexWriter writer=null;
			   Document doc=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++)
				{
					doc=new Document();
			    	doc.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
			    	doc.add(new Field("email",emails[i],Field.Store.YES,Field.Index.NOT_ANALYZED));
			    	doc.add(new Field("contents",contents[i],Field.Store.YES,Field.Index.ANALYZED));
			    	doc.add(new Field("name",names[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
			    	//存储数字
			    	doc.add(new NumericField("attachs",Field.Store.YES,true).setIntValue(attachs[i]));
			    	//存储日期
			    	doc.add(new NumericField("date",Field.Store.YES,true).setLongValue(dates[i].getTime()));
			    	String et=emails[i].substring(emails[i].lastIndexOf("@")+1);
			    	System.out.println(et);
			    	if(scores.containsKey(et))
			    	{
			    		doc.setBoost(scores.get(et));
			    	}
			    	else {
			    		doc.setBoost(0.5f);
					}
			    	
			    	writer.addDocument(doc); 
				}
			} 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{
				   if(writer!=null)
				   {
					  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 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
			}
        } 
		public lucene_index()
		{
			setDate();
			try {
				directory=FSDirectory.open(new File("f:/lucene/index02"));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		public void quary()
		{
			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();
			}
			
		}
		
		@SuppressWarnings("deprecation")
		public void undelete()
		{
			try {
				//回复时必须把reader的只读设为false
				IndexReader reader=IndexReader.open(directory,false);
				reader.undeleteAll();
				reader.close();
			} catch (CorruptIndexException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	
		//清空回收站,强制优化
		public void forceDelete()
		{
			IndexWriter writer=null;
			try {
				writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36,
						new StandardAnalyzer(Version.LUCENE_36)));
				//参数十一个选项,可以是一个query,也可以是一个term  term就是一个精确查找的值
				//此时删除的文档并未完全删除,而是存储在回收站中,可以恢复的
				writer.forceMergeDeletes();
			} catch (CorruptIndexException e) {
				e.printStackTrace();
			} catch (LockObtainFailedException e) {
				e.printStackTrace();
			} catch (IOException e) {
			    e.printStackTrace();
			}
			finally{
				if (writer!=null) {
					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 merge()
		{
			IndexWriter writer=null;
			try {
				writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36,
						new StandardAnalyzer(Version.LUCENE_36)));
				
				writer.forceMerge(2);
			} catch (CorruptIndexException e) {
				e.printStackTrace();
			} catch (LockObtainFailedException e) {
				e.printStackTrace();
			} catch (IOException e) {
			    e.printStackTrace();
			}
			finally{
				if (writer!=null) {
					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 delete()
		{
			IndexWriter writer=null;
			try {
				writer=new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36,
						new StandardAnalyzer(Version.LUCENE_36)));
				//参数十一个选项,可以是一个query,也可以是一个term  term就是一个精确查找的值
				//此时删除的文档并未完全删除,而是存储在回收站中,可以恢复的
				writer.deleteDocuments(new Term("id","1"));
			} catch (CorruptIndexException e) {
				e.printStackTrace();
			} catch (LockObtainFailedException e) {
				e.printStackTrace();
			} catch (IOException e) {
			    e.printStackTrace();
			}
			finally{
				if (writer!=null) {
					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()
		{
			/*lucene本身不支持更新
			 * 
			 * 通过删除索引然后再建立索引来更新
			 * 
			 */
		       IndexWriter writer=null;
			   Document doc=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++)
				{
					doc=new Document();
			    	doc.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
			    	doc.add(new Field("emails",emails[i],Field.Store.YES,Field.Index.NOT_ANALYZED));
			    	doc.add(new Field("contents",contents[i],Field.Store.YES,Field.Index.ANALYZED));
			    	doc.add(new Field("name",names[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
			    	writer.updateDocument(new Term("id","1"), doc); 
				}
			} 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{
				   if(writer!=null)
				   {
					  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 serch()
         {
        	 try {
				IndexReader reader=IndexReader.open(directory);
				IndexSearcher searcher=new IndexSearcher(reader);
				TermQuery query=new TermQuery(new Term("contents","like"));
				TopDocs tds=searcher.search(query, 10);
				
				for(ScoreDoc sd:tds.scoreDocs)
				{
					Document doc=searcher.doc(sd.doc);
					System.out.println("("+sd.doc+"-"+doc.getBoost()+"-"+sd.score+")"+doc.get("name")+"["+doc.get("email")+"]-->"
							+doc.get("id")+","+doc.get("attachs")+","+doc.get("date"));
				}
			} catch (CorruptIndexException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch blocket
				e.printStackTrace();
			}
         }

}
//测试类
package org.se.lucene;

import org.junit.Test;

public class test {

	@Test
	public void testIndex()
	{
		lucene_index l_index=new lucene_index();
		l_index.index();
    }
	@Test
	
	public void testquary()
	{
		lucene_index l_index=new lucene_index();
		l_index.quary();
	}
	@Test
	public void testDelete()
	{
		lucene_index l_index=new lucene_index();
		l_index.delete();
	}
	@Test
	public void testunDelete()
	{
		lucene_index l_index=new lucene_index();
		l_index.undelete();
	}
	@Test
	public void testForceDelete()
	{
		lucene_index l_index=new lucene_index();
		l_index.forceDelete();
	}
	@Test
	public void testmerge()
	{
		lucene_index l_index=new lucene_index();
		l_index.merge();
	}
	
	@Test
	public void upDate()
	{
		lucene_index l_index=new lucene_index();
		l_index.update();
	}
	
	@Test
	public void testSercher()
	{
		lucene_index l_index=new lucene_index();
		l_index.serch();
	}
}


分享到:
评论

相关推荐

    Lucene索引和查询

    在索引阶段,Lucene会分析文档内容,将其分解为小的单元——词项(Term)。这些词项构成了倒排索引(Inverted Index),这是一种数据结构,它允许我们快速找到包含特定词项的所有文档。具体步骤包括: - 分词...

    lucene 对 xml建立索引

    - 在建立索引之前,需要先将XML文档转换为Lucene能够理解的数据格式。 - 本例中采用SAX解析器来进行XML文档的解析,通过重写SAX处理器类的方法(如`startDocument()`、`endDocument()`、`startElement()`等)来...

    lucene 索引小示例

    《Lucene索引小示例解析》 Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。在Java编程环境中,Lucene被广泛应用于构建搜索功能,特别是对于大量文本数据的高效检索。本篇文章将通过一个简单的小...

    基于lucene技术的增量索引

    - **首次创建索引**:首先,我们需要遍历整个数据源,创建每个文档的实例,然后将这些文档添加到Lucene的索引writer中。完成这一步后,就会生成一个完整的初始索引。 - **监控数据变更**:为了实现增量索引,我们...

    Lucene3.0创建索引

    - `Field("indexDate", DateTools.dateToString(new Date(), DateTools.Resolution.DAY), Field.Store.YES, Field.Index.NOT_ANALYZED)`:添加索引日期字段。 4. **关闭索引写入器**: - 在完成所有文档的索引后...

    基于Java的全文索引检索引擎——Lucene

    【基于Java的全文索引检索引擎——Lucene】 Lucene是一个用Java编写的开源全文检索引擎库,由Doug Cutting创建并贡献给Apache基金会,成为Jakarta项目的一部分,后来成为Apache软件基金会下的顶级项目。它的主要...

    Lucene索引器实例

    - 创建`Document`对象:为每个要索引的记录创建一个文档实例,并为其添加字段。 - 使用`addDocument`方法:通过`IndexWriter`将文档添加到索引中。 **4. 更新和删除文档** - 更新文档:Lucene不支持直接更新已存在...

    lucene全文检索简单索引和搜索实例

    3. 索引(Index):索引是Lucene的核心,它将原始文本转化为一种可快速搜索的数据结构。通过分词器(Analyzer),将文本分解成单词(Token),然后构建倒排索引(Inverted Index),使得我们可以高效地查找包含特定...

    Lucene 索引的简单使用

    本篇文章将详细阐述如何使用Lucene来创建和查询索引,帮助你深入理解其核心概念和操作流程。 ### 1. Lucene基本概念 - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段...

    Lucene之删除索引

    在深入探讨Lucene删除索引这一主题之前,我们先来理解一下Lucene的基本概念。Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。它提供了高性能、可扩展的搜索和索引功能,广泛应用于各种应用程序中,如...

    lucene索引结构原理

    6. **段(Segment)**:为了提高效率,Lucene将大型索引拆分为多个较小的段。每个段都包含一个完整的倒排索引,新添加的文档会被写入新的段,旧的段可以被合并以减少段的数量。 7. **字段(Field)**:文档由多个...

    lucene索引查看工具及源码

    Luke 提供了诸如查看文档字段、搜索索引、查看倒排索引结构等功能,对于开发者来说是了解和调试 Lucene 索引的利器。 Luke 的源码也公开在 GitHub 上,这对于想深入理解 Lucene 内部机制的开发者来说是一个宝贵的...

    深入 Lucene 索引机制

    《深入 Lucene 索引机制》这篇博文主要探讨了Lucene这个全文搜索引擎的核心索引原理,它在信息检索领域有着广泛的应用。Lucene是一个开源的Java库,它提供了高效、可扩展的文本搜索功能。以下是对Lucene索引机制的...

    lucene 索引 查看 工具

    Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发,它为 Java 开发人员提供了强大的文本搜索功能。在 Lucene 的使用过程中,创建索引是关键步骤,而有时我们需要查看这些索引来了解其结构、内容以及优化...

    Lucene索引的基本操作

    本文将深入探讨Lucene索引的基本操作,包括如何添加文档到索引、更新已有的索引以及相关的测试代码。 ### 1. 初始化Lucene环境 首先,我们需要导入Lucene的相关库。在Java项目中,可以通过Maven或Gradle等构建工具...

    lucene索引查看程序及代码

    luke是一款开源的Lucene索引查看器,它允许用户以图形化界面的形式查看和操作Lucene索引。lukeall-0.8.1.jar是luke的运行文件,通过运行这个JAR文件,我们可以直接在Java环境中启动luke应用,进行索引的查看和分析。...

    Lucene初试——关于大文本建立索引和中文乱码以及QueryParser检索的一些体会 - sheen口开河 - CSDN博客

    【Lucene大文本建索引】 在使用Lucene处理大文本时,遇到的主要问题是内存溢出。当尝试一次性处理200M左右的文本时,可能会遇到`java.lang.OutOfMemoryError: Java heap space`错误。这主要是由于Lucene在内存中缓冲...

    lucene索引优化多线程多目录创建索引

    本教程主要探讨的是如何利用Lucene进行索引优化,特别是通过多线程和处理多个目录来提高索引创建效率。 首先,我们需要理解Lucene的索引原理。Lucene将文档分解为词项(tokens),并对每个词项创建倒排索引。倒排...

    lucene实现索引查询

    Lucene 是一个高性能、全文本搜索库,被广泛用于构建高效的搜索引擎和信息检索系统。它提供了完整的搜索功能,包括分析、索引、查询以及结果排序等。在Java开发中,Lucene 提供了丰富的API来简化这些操作。以下是...

    Lucene检索文本,建立索引

    首先,**Lucene** 是一个开源的Java库,它提供了完整的搜索功能,包括分词、索引创建、查询解析和结果排序。它的核心功能是能够对文本进行分析,将文本拆分成有意义的单元——称为“词项”(tokens),然后创建一个...

Global site tag (gtag.js) - Google Analytics