lucene 索引 demo
核心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
lucene 索引 demo的更多相关文章
- MySQL和Lucene索引对比分析
MySQL和Lucene都可以对数据构建索引并通过索引查询数据,一个是关系型数据库,一个是构建搜索引擎(Solr.ElasticSearch)的核心类库.两者的索引(index)有什么区别呢?以前写过 ...
- Lucene索引文件学习
最近在做搜索,抽空看一下lucene,资料挺多的,不过大部分都是3.x了--在对着官方文档大概看一下. 优化后的lucene索引文件(4.9.0) 一.段文件 1.段文件:segments_5p和s ...
- lucene索引
一.lucene索引 1.文档层次结构 索引(Index):一个索引放在一个文件夹中: 段(Segment):一个索引中可以有很多段,段与段之间是独立的,添加新的文档可能产生新段,不同的段可以合并成一 ...
- lucene 索引合并策略
在索引算法确定的情况下,最为影响Lucene索引速度有三个参数--IndexWriter中的 MergeFactor, MaxMergeDocs, RAMBufferSizeMB .这些参数无非是控制 ...
- Lucene学习笔记: 四,Lucene索引过程分析
对于Lucene的索引过程,除了将词(Term)写入倒排表并最终写入Lucene的索引文件外,还包括分词(Analyzer)和合并段(merge segments)的过程,本次不包括这两部分,将在以后 ...
- Lucene 索引功能
Lucene 数据建模 基本概念 文档(doc): 文档是 Lucene 索引和搜索的原子单元,文档是一个包含多个域的容器. 域(field): 域包含“真正的”被搜索的内容,每一个域都有一个标识名称 ...
- Lucene学习总结之四:Lucene索引过程分析
对于Lucene的索引过程,除了将词(Term)写入倒排表并最终写入Lucene的索引文件外,还包括分词(Analyzer)和合并段(merge segments)的过程,本次不包括这两部分,将在以后 ...
- lucene 索引查看工具
luke 是 lucene 索引查看工具,基于 swing 开发的,是 lucene.solr.nutch 开发过程中不可或缺的工具.在测试搜索过程,进程出现搜不到东西或者搜到的东西不是想要的结果时, ...
- 深入Lucene索引机制
Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙. 当我们真正进入到Lucene源代码之中的时候,我们会发现: Lucene的索引过程, ...
随机推荐
- ps commad
要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps (1) ps :是显示瞬间进程的状态,并不动态连续: (2) top:如果想对进 ...
- GPS部标平台的架构设计(四)-百度地图设计
部标GPS软件平台之百度地图设计 地图是客户端中不可缺少的一个模块,很多人在设计和画图时候,喜欢加上地图引擎这样高大上的字眼,显得自己的平台有内涵,说白了就是用第三方的SDK来开发,早期的GPS监 控 ...
- 浏览器桌面通知--Notification
前言 最近项目上要用到浏览器桌面通知,之前虽然知道有这个东西,但是一直没有用过,借此机会了解下桌面通知的机制,在此分享下. 1.权限 首先需要明确的是,不是所有网页都可以发桌面通知的,不然不得烦死,那 ...
- win10 pro 1511 激活成功
slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX slmgr /skms franklv.ddns.net slmgr /ato
- AIX系统的日常监控维护
UNIX操作系统在各电信运营商中应用非常广泛,各种业务管理系统的后台服务器几乎都采用UNIX操作系统.AIX作为UNIX操作系统中的一种, 因其稳定性高.兼容性好的特点受到众多系统管理员的欢迎.下面提 ...
- struts2:字段校验和非字段校验代码示例
一.为什么要使用struts2的validate验证框架 :使用struts2的验证框架,能够提高客户端提交的数据的安全性.通过验证,确保保存进数据库的信息是正确的 二.使用struts2的valid ...
- WebSocket///////////////////////z
作者:Ovear链接:http://www.zhihu.com/question/20215561/answer/40316953来源:知乎著作权归作者所有,转载请联系作者获得授权. 一.WebSoc ...
- WORD学习之制作座位表
1.点击插入-表格-插入表格,将表格的列数设置为6,行数为10,再点击“确定”按钮
- 配置java环境 ,安装Android Studio...(ps:用eclipse也不错,但as是趋势 自己凭爱好选择)
to:青科大可爱的学弟学妹: 配置java环境 step1:下jdk 直接打开链接即可(ps:复制链接到迅雷下载更快哦) 64位的:http://download.oracle.com/otn-pub ...
- java基础复习:final,static,以及String类
2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...