核心util
/**
* Alipay.com Inc.
* Copyright (c) 2004-2015 All Rights Reserved/
*/
package com.lucene.demo;
import com.demo.convertor.BookConvertor;
import com.demo.domain.BookDO;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
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.util.Version;
import java.io.IOException;
/**
* 索引操作工具
*
* @author baoxing.gbx
* @version $Id:IndexUtil.java, V 0.1 2015-11-15 14:23 baoxing.gbx Exp $$
*/
public class IndexUtil extends BaseUtil {
/**
* 创建索引
*/
public static void creatIndex() throws Exception {
try {
// 循环添加书
for (int i = 1; i <= 2; ++i) {
BookDO bookDO = new BookDO();
bookDO.setId(i);
bookDO.setAuthor("zhangsan" + i);
bookDO.setName("Java program" + i);
bookDO.setContent("Java是一种可以撰写跨平台应用程序的面向对象的程序设计开发语言");
addDoc(bookDO);
}
for (int i = 3; i <= 4; ++i) {
BookDO bookDO = new BookDO();
bookDO.setId(i);
bookDO.setAuthor("lisi" + i);
bookDO.setName("Java program" + i);
bookDO.setContent(
"Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网");
addDoc(bookDO);
}
for (int i = 5; i <= 6; ++i) {
BookDO bookDO = new BookDO();
bookDO.setId(i);
bookDO.setAuthor("wangwu" + i);
bookDO.setName("Java program" + i);
bookDO.setContent("同时拥有全球最大的开发者专业社");
addDoc(bookDO);
}
for (int i = 7; i <= 8; ++i) {
BookDO bookDO = new BookDO();
bookDO.setId(i);
bookDO.setAuthor("xiaoming" + i);
bookDO.setName("C++ program" + i);
bookDO.setContent("C++是在C语言的基础上开发的一种面向对象编程语言");
addDoc(bookDO);
}
} catch (Exception e) {
logger.equals("索引创建失败:" + e.getMessage());
throw e;
}
}
/**
* 删除索引
*/
public static void deleteIndex() throws Exception {
try {
Term term = new Term("id", 1 + "");
IndexWriter indexWriter = getIndexWriter();
indexWriter.deleteDocuments(term);
indexWriter.commit();
} catch (Exception e) {
logger.error("删除索引失败");
throw e;
}
}
/**
* 删除索引
*/
public static void deleteAllIndex() throws Exception {
try {
getIndexWriter().deleteAll();
getIndexWriter().commit();
} catch (IOException e) {
logger.equals("索引删除失败:" + e.getMessage());
throw e;
}
}
/**
* 删除索引
*/
public static void updateIndex() throws Exception {
Term term = new Term("id", 1 + "");
BookDO bookDO = new BookDO();
bookDO.setId(1);
bookDO.setAuthor("zhangsan" + 1);
bookDO.setName("Java program" + 1);
bookDO.setContent("Java");
try {
getIndexWriter().updateDocument(term, BookConvertor.convert2Doc(bookDO));
getIndexWriter().commit();
} catch (IOException e) {
logger.equals("索引更新失败:" + e.getMessage());
throw e;
}
}
/**
* 模拟数据库添加,同时添加索引
*
* @param bookDO
* @throws IOException
*/
private static void addDoc(BookDO bookDO) throws IOException {
// 数据库操作
dataBase.put(bookDO.getId() + "", bookDO);
// 索引操作
Document document = BookConvertor.convert2Doc(bookDO);
getIndexWriter().addDocument(document);
// 必须提交否则不奏效
getIndexWriter().commit();
}
/**
* 检索
*
* @param keyword
*/
public static void search(String keyword) throws Exception {
IndexSearcher searcher = null;
try {
// 创建search
searcher = getIndexSearcher();
String[] fields = { "name", "author", "content" };
QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_35, fields,
new StandardAnalyzer(Version.LUCENE_35));
queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
Query query = queryParser.parse(keyword);
// 查询
TopDocs topDocs = searcher.search(query, MAX);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
logger.info("查询到条数=" + scoreDocs.length);
for (ScoreDoc scoreDoc : scoreDocs) {
Document doc = searcher.doc(scoreDoc.doc);
logger.info("doc信息:" + "docId=" + scoreDoc.doc + "id=" + doc.get("id") + "author="
+ doc.get("author") + "name=" + doc.get("name") + "content="
+ doc.get("content"));
}
} catch (Exception e) {
logger.error("查询失败:" + e.getMessage());
throw e;
}
}
public static void numDocs() throws IOException {
IndexReader indexReader = getIndexReader();
logger.info("已删除的数量" + indexReader.numDeletedDocs());
logger.info("numDocs" + indexReader.numDocs());
logger.info("maxDoc" + indexReader.maxDoc());
}
}
测试
/**
* Alipay.com Inc.
* Copyright (c) 2004-2015 All Rights Reserved/
*/
package com.demo;
import com.lucene.demo.IndexUtil;
import org.junit.Test;
import junit.framework.TestCase;
import java.io.IOException;
/**
*
* @author baoxing.gbx
* @version $Id:IndexUtilTest.java, V 0.1 2015-11-15 14:49 baoxing.gbx Exp $$
*/
public class IndexUtilTest extends TestCase {
@Override
protected void setUp() throws Exception {
IndexUtil.creatIndex();
}
/**
* 创建索引
*
*/
@Test
public void testCreate() {
try {
IndexUtil.creatIndex();
} catch (Exception e) {
assertTrue(e.getMessage(), false);
}
}
/**
* 删除索引
*/
@Test
public void testDelete() {
try {
IndexUtil.search("Java");
IndexUtil.numDocs();
IndexUtil.deleteIndex();
IndexUtil.search("Java");
IndexUtil.numDocs();
} catch (Exception e) {
assertTrue(e.getMessage(), false);
}
}
/**
* 删除索引
*/
@Test
public void testDeleteAll() {
try {
IndexUtil.search("Java");
IndexUtil.numDocs();
IndexUtil.deleteAllIndex();
IndexUtil.search("Java");
IndexUtil.numDocs();
} catch (Exception e) {
assertTrue(e.getMessage(), false);
}
}
/**
* 删除索引
*/
@Test
public void testSearch() throws Exception {
try {
IndexUtil.search("Java");
IndexUtil.numDocs();
} catch (Exception e) {
assertTrue(e.getMessage(), false);
}
}
@Test
public void testNuns() throws Exception {
try {
IndexUtil.numDocs();
} catch (IOException e) {
assertTrue(e.getMessage(), false);
}
}
/**
* 更新
*
* @throws Exception
*/
@Test
public static void testUpdate() throws Exception {
try {
IndexUtil.numDocs();
IndexUtil.search("Java");
IndexUtil.updateIndex();
System.out.println("更新完毕");
IndexUtil.numDocs();
IndexUtil.search("Java");
} catch (IOException e) {
assertTrue(e.getMessage(), false);
}
}
}
git代码地址: https://github.com/EstarG/lucenceDemo