Lucene4.4学习案例-基本操作

package com.bean.lucene.util;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

/**
 * Lucene模版工具类
 * @author 周景
 *
 */
public class LuceneTemplet {
	
	/**
	 * 索引库URL
	 */
	public static final String INDEX_URL = System.getProperty("user.dir") + File.separator + "index";
	/**
	 * 索引目录
	 */
	private static Directory directory;
	/**
	 * 读索引
	 */
	private static DirectoryReader reader;
	/**
	 * 写索引
	 */
	private static IndexWriter writer;

	/**
	 * 加载
	 */
	static {
		try {
			directory = FSDirectory.open(new File(INDEX_URL));
			reader = DirectoryReader.open(directory);
			writer = new IndexWriter(directory, new IndexWriterConfig( Version.LUCENE_44, new StandardAnalyzer(Version.LUCENE_44) ));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取索引搜索对象
	 * @return
	 */
	public static IndexSearcher getSearcher() {
		try {
			DirectoryReader r = DirectoryReader.openIfChanged(reader);
			if (r != null) {
				reader.close();
				reader = r;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return new IndexSearcher(reader);
	}
	
	/**
	 * 创建索引
	 * @param ci
	 */
	public static void writer(WriterIndex w) {
		w.writer(writer);
	}
	
	/**
	 * 搜索索引
	 * @param si
	 */
	public static void search(SearchIndex s) {
		s.search(getSearcher());
	}
	
}

/**
 * 操作索引抽象类
 * @author 周景
 * 
 */
abstract class WriterIndex {
	/**
	 * 操作索引
	 */
	public abstract void writer(IndexWriter writer);
}

/**
 * 搜索索引抽象类
 * @author 周景
 * 
 */
abstract class SearchIndex {
	/**
	 * 搜索索引
	 */
	public abstract void search(IndexSearcher searcher);
}

package com.bean.lucene.util;

import static org.junit.Assert.*;

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.document.IntField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.util.Version;
import org.junit.Test;

public class LuceneTempletTest {
	
	/**
	 * 初始化索引
	 */
	@Test
	public void createrIndex() {
		final int[] ids = {1, 2, 3};
		final String[] titles =  {"title1", "title2", "title3"};
		final String[] contents = {"hello world love Anthena!", "my go Home. Go To Home", "I love you too Home love."};
		
		LuceneTemplet.writer(new WriterIndex() {
			@Override
			public void writer(IndexWriter writer) {
				Document doc = null;
				try {
					for (int i=0; i<ids.length; i++) {
						doc = new Document();
						doc.add(new IntField("id", ids[i], Field.Store.YES));
						doc.add(new StringField("title", titles[i], Field.Store.YES));
						doc.add(new TextField("content", contents[i], Field.Store.YES));
						writer.addDocument(doc);
					}
					writer.commit();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	/**
	 * 查看索引数量
	 */
	@Test
	public void lookIndexCount() {
		LuceneTemplet.search(new SearchIndex() {
			@Override
			public void search(IndexSearcher searcher) {
				IndexReader reader = searcher.getIndexReader();
				System.out.println("NumDocs:" + reader.numDocs() + "\tMaxDocs:" + reader.maxDoc());
			}
		});
	}
	
	/**
	 * 清空索引
	 */
	@Test
	public void clearIndex() {
		LuceneTemplet.writer(new WriterIndex() {
			@Override
			public void writer(IndexWriter writer) {
				try {
					writer.deleteAll();
					writer.commit();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	/**
	 * 精准搜索
	 */
	@Test
	public void search1() {
		LuceneTemplet.search(new SearchIndex() {
			@Override
			public void search(IndexSearcher searcher) {
				try {
					TermQuery query = new TermQuery(new Term("content", "love"));
					TopDocs docs = searcher.search(query, 10);
					for (ScoreDoc d : docs.scoreDocs) {
						Document doc = searcher.doc(d.doc);
						System.out.println(d.doc + "-id:" + doc.get("id") + "\ttitle:" + doc.get("title") + "\tcontent:" + doc.get("centent"));
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	/**
	 * 通用搜索
	 */
	@Test
	public void search2() {
		LuceneTemplet.search(new SearchIndex() {
			@Override
			public void search(IndexSearcher searcher) {
				try {
					QueryParser parser = new QueryParser(Version.LUCENE_44, "content", new StandardAnalyzer(Version.LUCENE_44));
					Query query = parser.parse("love you");
					TopDocs docs = searcher.search(query, 10);
					for (ScoreDoc d : docs.scoreDocs) {
						Document doc = searcher.doc(d.doc);
						System.out.println(d.doc + "-id:" + doc.get("id") + "\ttitle:" + doc.get("title") + "\tcontent:" + doc.get("centent"));
					}
				} catch (IOException e) {
					e.printStackTrace();
				} catch (ParseException e) {
					e.printStackTrace();
				}
			}
		});
	}

}

 

所需jar包:

lucene-analyzers-common-4.4.0.jar

lucene-core-4.4.0.jar

lucene-queryparser-4.4.0.jar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值