Lucene系列:(3)LuceneUtils之CRUD

第二版

LuceneUtils.java

package com.rk.lucene.utils;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;

import com.rk.lucene.entity.Article;

public class LuceneUtils {
	private static Directory directory;
	private static Version version;
	private static Analyzer analyzer;
	private static MaxFieldLength maxFieldLength;
	private static final String LUCENE_DIRECTORY= "D:/rk/indexDB";

	static{
		try {
			directory = FSDirectory.open(new File(LUCENE_DIRECTORY));
			version = Version.LUCENE_30;
			analyzer = new StandardAnalyzer(version);
			maxFieldLength = MaxFieldLength.LIMITED;
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	//不让外部new当前帮助类的对象
	private LuceneUtils(){}

	public static <T> void add(T t) throws Exception{
		Document document = javabean2document(t);
		IndexWriter indexWriter = new IndexWriter(getDirectory(), getAnalyzer(), getMaxFieldLength());
		indexWriter.addDocument(document);
		indexWriter.close();
	}

	public static <T> void addAll(List<T> list) throws Exception{
		IndexWriter indexWriter = new IndexWriter(getDirectory(), getAnalyzer(), getMaxFieldLength());
		for(T t : list){
			Document doc = javabean2document(t);
			indexWriter.addDocument(doc);
		}
		indexWriter.close();
	}

	public static <T> void update(String field,String value,T t) throws Exception{
		Document document = javabean2document(t);
		IndexWriter indexWriter = new IndexWriter(getDirectory(), getAnalyzer(), getMaxFieldLength());
		indexWriter.updateDocument(new Term(field,value), document);
		indexWriter.close();
	}

	public static <T> void delete(String field,String value) throws Exception{
		IndexWriter indexWriter = new IndexWriter(getDirectory(), getAnalyzer(), getMaxFieldLength());
		indexWriter.deleteDocuments(new Term(field,value));
		indexWriter.close();
	}

	public static void deleteAll() throws Exception {
		IndexWriter indexWriter = new IndexWriter(getDirectory(), getAnalyzer(), getMaxFieldLength());
		indexWriter.deleteAll();
		indexWriter.close();
	}

	public static <T> List<T> search(String field,String keyword,int topN) throws Exception{
		List<T> list = new ArrayList<T>();

		QueryParser queryParser = new QueryParser(getVersion(), field, getAnalyzer());
		Query query = queryParser.parse(keyword);

		IndexSearcher indexSearcher = new IndexSearcher(getDirectory());
		TopDocs topDocs = indexSearcher.search(query, topN);

		for(int i=0;i<topDocs.scoreDocs.length;i++){
			ScoreDoc scoreDoc = topDocs.scoreDocs[i];
			int docIndex = scoreDoc.doc;
			System.out.println("文档索引号" + docIndex + ",文档得分:" + scoreDoc.score);
			Document document = indexSearcher.doc(docIndex);
			T entity = (T) document2javabean(document, Article.class);
			list.add(entity);
		}
		indexSearcher.close();
		return list;
	}

	public static <T> void printList(List<T> list){
		if(list != null && list.size()>0){
			for(T t : list){
				System.out.println(t);
			}
		}
	}

	//将JavaBean转成Document对象
	public static Document javabean2document(Object obj) throws Exception{
		//创建Document对象
		Document document = new Document();
		//获取obj引用的对象字节码
		Class clazz = obj.getClass();
		//通过对象字节码获取私有的属性
		java.lang.reflect.Field[] reflectFields = clazz.getDeclaredFields();
		//迭代
		for(java.lang.reflect.Field reflectField : reflectFields){
			//反射
			reflectField.setAccessible(true);
			//获取字段名
			String name = reflectField.getName();
			//获取字段值
			String value = reflectField.get(obj).toString();
			//加入到Document对象中去,这时javabean的属性与document对象的属性相同
			document.add(new Field(name, value, Store.YES, Index.ANALYZED));
		}
		//返回document对象
		return document;
	}
	//将Document对象转换成JavaBean对象
	public static <T> T document2javabean(Document document,Class<T> clazz) throws Exception{
		T obj = clazz.newInstance();
		java.lang.reflect.Field[] reflectFields = clazz.getDeclaredFields();
		for(java.lang.reflect.Field reflectField : reflectFields){
			reflectField.setAccessible(true);
			String name = reflectField.getName();
			String value = document.get(name);
			BeanUtils.setProperty(obj, name, value);
		}
		return obj;
	}

	public static Directory getDirectory() {
		return directory;
	}

	public static void setDirectory(Directory directory) {
		LuceneUtils.directory = directory;
	}

	public static Version getVersion() {
		return version;
	}

	public static void setVersion(Version version) {
		LuceneUtils.version = version;
	}

	public static Analyzer getAnalyzer() {
		return analyzer;
	}

	public static void setAnalyzer(Analyzer analyzer) {
		LuceneUtils.analyzer = analyzer;
	}

	public static MaxFieldLength getMaxFieldLength() {
		return maxFieldLength;
	}

	public static void setMaxFieldLength(MaxFieldLength maxFieldLength) {
		LuceneUtils.maxFieldLength = maxFieldLength;
	}

	//测试
	public static void main(String[] args) throws Exception {
		Article article = new Article(1, "你好", "欢迎来到我的世界");
		Document document = javabean2document(article);

		Article a2 = (Article) document2javabean(document, Article.class);
		System.out.println(a2);
	}
}

ArticleDao2.java

package com.rk.lucene.crud;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import com.rk.lucene.entity.Article;
import com.rk.lucene.utils.LuceneUtils;

public class ArticleDao2 {
	@Test
	public void testAdd() throws Exception{
		List<Article> articleList = new ArrayList<Article>();
		articleList.add(new Article(1, "卫星地图", "从卫星上鸟瞰地球,感受前所未有的视觉冲击。"));
		articleList.add(new Article(2, "未来地球", "2025年的未来地球将面临资源耗尽的难题"));
		articleList.add(new Article(3, "谷歌地球", "Google Earth(谷歌地球)是一款Google公司开发的虚拟地球仪软件"));
		articleList.add(new Article(4, "十大科学发现", "2016年十大科学发现 发现另一个地球。"));
		articleList.add(new Article(5, "纪录片BBC", "电视系列片"行星地球"(2006)的电影版本,拍摄了几个动物家庭的迁徙路线。"));
		articleList.add(new Article(6, "神秘的地球", "神秘的地球 神秘的地球网站内容涉及宇宙奥秘、航空航天、考古发现"));
		articleList.add(new Article(7, "科学网", "俄专家确认去年5月探测神秘无线电信号来自地球"));
		articleList.add(new Article(8, "地球公转", "地球公转就是地球按一定轨道围绕太阳转动"));
		articleList.add(new Article(9, "黑洞", "人类在宇宙中已经辨识出了许多黑洞,既有恒星级黑洞,也有超大质量黑洞。"));
		articleList.add(new Article(10, "白洞是如何形成的", "20世纪60年代中期苏联学者诺维柯夫和尼曼又各自提出了白洞理论"));

		LuceneUtils.addAll(articleList);
	}

	@Test
	public void testSearch() throws Exception{
		List<Article> list = LuceneUtils.search("content", "地球", 10);
		LuceneUtils.printList(list);
	}

	@Test
	public void testUpdate() throws Exception{
		Article article = new Article(3, "你好", "欢迎来到我的地球");
		LuceneUtils.update("id","3",article);
	}

	@Test
	public void testDelete() throws Exception{
		LuceneUtils.delete("id","3");
	}
}
第一版

LuceneUtils.java

package com.rk.lucene.utils;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;

import com.rk.lucene.entity.Article;

public class LuceneUtils {
	private static Directory directory;
	private static Version version;
	private static Analyzer analyzer;
	private static MaxFieldLength maxFieldLength;

	static{
		try {
			directory = FSDirectory.open(new File("D:/rk/indexDB"));
			version = Version.LUCENE_30;
			analyzer = new StandardAnalyzer(version);
			maxFieldLength = MaxFieldLength.LIMITED;
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	//不让外部new当前帮助类的对象
	private LuceneUtils(){}

	//将JavaBean转成Document对象
	public static Document javabean2document(Object obj) throws Exception{
		//创建Document对象
		Document document = new Document();
		//获取obj引用的对象字节码
		Class clazz = obj.getClass();
		//通过对象字节码获取私有的属性
		java.lang.reflect.Field[] reflectFields = clazz.getDeclaredFields();
		//迭代
		for(java.lang.reflect.Field reflectField : reflectFields){
			//反射
			reflectField.setAccessible(true);
			//获取字段名
			String name = reflectField.getName();
			//获取字段值
			String value = reflectField.get(obj).toString();
			//加入到Document对象中去,这时javabean的属性与document对象的属性相同
			document.add(new Field(name, value, Store.YES, Index.ANALYZED));
		}
		//返回document对象
		return document;
	}
	//将Document对象转换成JavaBean对象
	public static <T> T document2javabean(Document document,Class<T> clazz) throws Exception{
		T obj = clazz.newInstance();
		java.lang.reflect.Field[] reflectFields = clazz.getDeclaredFields();
		for(java.lang.reflect.Field reflectField : reflectFields){
			reflectField.setAccessible(true);
			String name = reflectField.getName();
			String value = document.get(name);
			BeanUtils.setProperty(obj, name, value);
		}
		return obj;
	}

	public static Directory getDirectory() {
		return directory;
	}

	public static void setDirectory(Directory directory) {
		LuceneUtils.directory = directory;
	}

	public static Version getVersion() {
		return version;
	}

	public static void setVersion(Version version) {
		LuceneUtils.version = version;
	}

	public static Analyzer getAnalyzer() {
		return analyzer;
	}

	public static void setAnalyzer(Analyzer analyzer) {
		LuceneUtils.analyzer = analyzer;
	}

	public static MaxFieldLength getMaxFieldLength() {
		return maxFieldLength;
	}

	public static void setMaxFieldLength(MaxFieldLength maxFieldLength) {
		LuceneUtils.maxFieldLength = maxFieldLength;
	}

	//测试
	public static void main(String[] args) throws Exception {
		Article article = new Article(1, "你好", "欢迎来到我的世界");
		Document document = javabean2document(article);

		Article a2 = (Article) document2javabean(document, Article.class);
		System.out.println(a2);
	}
}

ArticleDao.java

package com.rk.lucene.crud;

import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.junit.Test;

import com.rk.lucene.entity.Article;
import com.rk.lucene.utils.LuceneUtils;

public class ArticleDao {
	public void add(Article article) throws Exception{
		Document document = LuceneUtils.javabean2document(article);
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());
		indexWriter.addDocument(document);
		indexWriter.close();
	}

	public void addAll(List<Article> articleList) throws Exception{
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());
		for(Article article : articleList){
			Document doc = LuceneUtils.javabean2document(article);
			indexWriter.addDocument(doc);
		}
		indexWriter.close();
	}

	public void update(Article article) throws Exception{
		Document document = LuceneUtils.javabean2document(article);
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());
		indexWriter.updateDocument(new Term("id",document.get("id")), document);
		indexWriter.close();
	}

	public void delete(String field,String txt) throws Exception{
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());
		indexWriter.deleteDocuments(new Term(field,txt));
		indexWriter.close();
	}

	public void deleteAll() throws Exception {
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());
		indexWriter.deleteAll();
		indexWriter.close();
	}

	public <T> List<T> search(String field,String keyword,int topN) throws Exception{
		List<T> list = new ArrayList<T>();

		QueryParser queryParser = new QueryParser(LuceneUtils.getVersion(), field, LuceneUtils.getAnalyzer());
		Query query = queryParser.parse(keyword);

		IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.getDirectory());
		TopDocs topDocs = indexSearcher.search(query, topN);

		for(int i=0;i<topDocs.scoreDocs.length;i++){
			ScoreDoc scoreDoc = topDocs.scoreDocs[i];
			System.out.println(scoreDoc.score);
			int docIndex = scoreDoc.doc;
			Document document = indexSearcher.doc(docIndex);
			T entity = (T) LuceneUtils.document2javabean(document, Article.class);
			list.add(entity);
		}
		indexSearcher.close();
		return list;
	}

	public <T> void print(List<T> list){
		if(list != null && list.size()>0){
			for(T t : list){
				System.out.println(t);
			}
		}
	}

	@Test
	public void testAdd() throws Exception{
		List<Article> articleList = new ArrayList<Article>();
		articleList.add(new Article(1, "卫星地图", "从卫星上鸟瞰地球,感受前所未有的视觉冲击。"));
		articleList.add(new Article(2, "未来地球", "2025年的未来地球将面临资源耗尽的难题"));
		articleList.add(new Article(3, "谷歌地球", "Google Earth(谷歌地球)是一款Google公司开发的虚拟地球仪软件"));
		articleList.add(new Article(4, "十大科学发现", "2016年十大科学发现 发现另一个地球。"));
		articleList.add(new Article(5, "纪录片BBC", "电视系列片"行星地球"(2006)的电影版本,拍摄了几个动物家庭的迁徙路线。"));
		articleList.add(new Article(6, "神秘的地球", "神秘的地球 神秘的地球网站内容涉及宇宙奥秘、航空航天、考古发现"));
		articleList.add(new Article(7, "科学网", "俄专家确认去年5月探测神秘无线电信号来自地球"));
		articleList.add(new Article(8, "地球公转", "地球公转就是地球按一定轨道围绕太阳转动"));
		articleList.add(new Article(9, "黑洞", "人类在宇宙中已经辨识出了许多黑洞,既有恒星级黑洞,也有超大质量黑洞。"));
		articleList.add(new Article(10, "白洞是如何形成的", "20世纪60年代中期苏联学者诺维柯夫和尼曼又各自提出了白洞理论"));

		addAll(articleList);
	}

	@Test
	public void testSearch() throws Exception{
		List<Article> list = search("content", "地球", 10);
		print(list);
	}

	@Test
	public void testUpdate() throws Exception{
		Article article = new Article(3, "你好", "欢迎来到我的地球");
		update(article);
	}

	@Test
	public void testDelete() throws Exception{
		//delete("id", "1");
		delete("id","3");
	}

}
时间: 2024-08-06 11:09:55

Lucene系列:(3)LuceneUtils之CRUD的相关文章

Lucene系列:(4)LuceneUtils之同步分页

1.工具类LuceneUtils LuceneUtils.java package com.rk.lucene.utils; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.apache.commons.beanutils.BeanUtils; import 

Lucene系列:(5)LuceneUtils之索引库优化

1.什么是索引库 索引库是Lucene的重要的存储结构,它包括二部份:原始记录表,词汇表 原始记录表:存放的是原始记录信息,Lucene为存入的内容分配一个唯一的编号 词汇表:存放的是经过分词器拆分出来的词汇和该词汇在原始记录表中的编号 2.为什么要将索引库进行优化 在默认情况下,向索引库中增加一个Document对象时,索引库自动会添加一个扩展名叫*.cfs的二进制压缩文件,如果向索引库中存Document对象过多,那么*.cfs也会不断增加,同时索引库的容量也会不断增加,影响索引库的大小.

Lucene系列:(6)分词器

1.什么是分词器 采用一种算法,将中英文本中的字符拆分开来,形成词汇,以待用户输入关健字后搜索 2.为什么要分词器 因为用户输入的搜索的内容是一段文本中的一个关健字,和原始表中的内容有差别,但作为搜索引擎来讲,又得将相关的内容搜索出来,此时就得采用分词器来最大限度匹配原始表中的内容. 3.分词器工作流程 (1)按分词器拆分出词汇 (2)去除停用词和禁用词 (3)如果有英文,把英文字母转为小写,即搜索不分大小写 4.演示常用分词器测试 这里测试需要引入IKAnalyzer3.2.0Stable.j

Lucene系列:(7)搜索关键字高亮

在搜索结果中,将与关健字相同的字符用红色显示 TestHighlighter.java package com.rk.lucene.d_highlighter; import java.util.ArrayList; import java.util.List; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.query

Lucene系列:(8)搜索结果摘要

如果搜索结果内容太多,我们只想显示前几个字符, 必须与高亮一起使用 TestFragment.java package com.rk.lucene.e_fragment; import java.util.ArrayList; import java.util.List; import org.apache.lucene.document.Document; import org.apache.lucene.queryParser.QueryParser; import org.apache.l

Lucene系列:(9)搜索结果排序

1.什么是搜索结果排序 搜索结果是按某个或某些字段高低排序来显示的结果 2.影响网站排名的多种因素 head/meta/ 网页的标签整洁 网页执行速度 采用div+css ...... 3.Lucene中的显示结果次序与相关度得分有关     ScoreDoc.score; 默认情况下,Lucene是按相关度得分排序的,得分高排在前,得分低排在后 如果相关度得分相同,按插入索引库的先后次序排序 4.Lucene中的手工设置相关度得分 IndexWriter indexWriter = new I

Lucene系列:(10)多条件搜索 QueryParser

1.什么是条件搜索 用关健字与指定的单列或多例进行匹配的搜索 2.单字段条件搜索 QueryParser queryParser = new QueryParser(LuceneUtils.getVersion(),"content",LuceneUtils.getAnalyzer()); 3.多字段条件搜索,项目中提倡多字段搜索 QueryParser queryParser = new MultiFieldQueryParser(LuceneUtils.getVersion(),n

Lucene系列:(11)异步分页

使用到的jar包,分为4部分: (1)beanutils commons-beanutils-1.9.2.jar commons-collections-3.2.1.jar commons-logging-1.1.1.jar (2)gson gson-2.6.2.jar (3)IK Analyzer IKAnalyzer3.2.0Stable.jar (4)lucene lucene-analyzers-3.0.2.jar lucene-core-3.0.2.jar lucene-highlig

[lucene系列笔记1]lucene6的安装与配置(Windows系统)

lucene是一个java开源的高效全文检索工具包,最近做项目要用到,把学习的过程记录一下. 第一步:下载安装jdk 1.首先从官网下载jdk(下载之前先查看你的电脑是多少位操作系统,如果是32就下载32的,如果是64位就下载64位的,否则不能兼容).下载之后解压到当前文件夹,双击安装JDK的可执行文件,按步骤和提示,一直点"下一步"完成安装,这里假设安装到目标文件C:\Program Files\Java\jdk1.8.0_25: 2.JDK安装完成后,需手动配置环境变量,右键&qu