Lucene学习-CRUD
来源:互联网 发布:sqlserver下载 64位 编辑:程序博客网 时间:2024/05/16 07:08
对Lucene的CRUD进行了简单的封装,算是阶段总结吧,封装的时候发现重新造一个完美的轮子是困难的。。。还是自己水平有限,等学完Lucene之后希望进行一个可行,更具有实用性的封装。
需要注意的事
在update中浪费了大量时间,结果发现 indexWriter.updateDocument(null, document);
中Term设置为null可是可以的。。。会把所有的document属性update,而加上Term只是update改变的属性
创建ArticleDao.java类
package com.bart.lucene.curd;import java.io.IOException;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.Before;import org.junit.Test;import com.bart.lucene.entity.Article;import com.bart.lucene.util.LuceneUtils;/** * 封装CRUD类 * @author hp */public class ArticleDao { /** * 增加Article对象到索引库 * @param article * @throws Exception */ 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(); } /** * 批量增加Article对象到索引库 * @param list * @throws Exception */ public void addAll(List<Article>list) throws Exception{ for(Article article : list){ add(article); } } /** * 根据关键词查询 * @param keyword:查询关键字 * @param attr :要查询的Article字段,必须和Article字段名字相同 * @return 返回document对象的集合 * @throws Exception */ public List<Document> search(String keyword,String attr) throws Exception{ List<Document> documentList = new ArrayList<Document>(); // 2. 创建indexSearcher IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.getDirectory()); // 3. 创检查询解析器对象 QueryParser queryParser = new QueryParser(LuceneUtils.getVersion(),attr,LuceneUtils.getAnalyzer()); // 4. 创建对象封装查询关键字 Query query = queryParser.parse(keyword); // 5. 查询 int MAX_RECORD=100; TopDocs topDocs = indexSearcher.search(query, MAX_RECORD); ScoreDoc[] scoreDocs = topDocs.scoreDocs; Document document = null; //如果查找到结果 if(scoreDocs!=null && scoreDocs.length >0){ // 6. 迭代词汇表中符合条件的编号 for(int i=0;i<topDocs.scoreDocs.length;i++){ // 6.1 取出封装编号和分数的scoreDoc对象 ScoreDoc scoreDoc = topDocs.scoreDocs[i]; // 6.2 取出来每一个编号 int no = scoreDoc.doc; // 6.3 根据编号去索引库中原始记录表中查询对应的document对象 document = indexSearcher.doc(no); documentList.add(document); } return documentList; }else { return null; } } /** * 升级索引库中对应的Article * @param article :需要修改的Article对象 * @param attrName :要修改的Article属性名,必须和Article类字段同名 * @throws Exception */ public void update(Article article,String attrName) throws Exception{ IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength()); Document document = LuceneUtils.javaBean2Document(article); //先查询该字段根据id查询唯一结果 List<Document>list = search(article.getId().toString(),"id"); if (list!=null&&list.size()>0) { System.out.println(list.get(0).get(attrName)+"--->"); /* * 参数一:term表示需要更新的document对象,id表示document对象中的id属性,7表示该id属性的值 * 参数二:新的document对象 */ Term term = new Term("id",article.getId().toString()); System.out.println(document.get(attrName));// indexWriter.updateDocument(null, document); indexWriter.updateDocument(term,document);//核心 indexWriter.close(); }else { throw new RuntimeException("Article not exist , make sure Article have 'id' arrtibute"); } } /** * 删除一个Article * @param article * @throws Exception */ public void delete(Article article) throws Exception{ IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(),LuceneUtils.getAnalyzer(),LuceneUtils.getMaxFieldLength()); indexWriter.deleteDocuments(new Term("id","2"));//核心 indexWriter.close(); } /** * 删除所有的Article * @throws Exception */ public void deleteAll() throws Exception{ IndexWriter indexWriter = new IndexWriter(LuceneUtils.getDirectory(),LuceneUtils.getAnalyzer(),LuceneUtils.getMaxFieldLength()); indexWriter.deleteAll();//核心 indexWriter.close(); } /* * 测试方法 */ private ArticleDao articleDao; @Before public void before(){ articleDao = new ArticleDao(); } @Test public void testAdd() throws Exception{ Article article = new Article(4,"HDD硬盘","HDD硬盘是机械硬盘,是迄今为止最常用的硬盘"); articleDao.add(article); } @Test public void testAddAll() throws Exception{ Article article1 = new Article(5,"HDD硬盘","HDD硬盘是机械硬盘,是迄今为止最常用的硬盘"); Article article2 = new Article(6,"SSD硬盘","HDD硬盘是固态硬盘,是迄今为止最速度最快的硬盘"); Article article3 = new Article(7,"显示器","显示器是电脑的输出设备"); Article article4 = new Article(8,"键盘","键盘是常用的输入设备"); Article article5 = new Article(9,"鼠标","鼠标也是一种常用的输入设备"); List<Article>list = new ArrayList<Article>(); list.add(article1); list.add(article2); list.add(article3); list.add(article4); list.add(article5); addAll(list); } @Test public void testSearch() throws Exception{ List<Document>list = search("显卡","title");//id/title/content if (list!=null&&list.size()>0) { System.out.println(list.get(0).get("title"));//查询关键词“电脑”结果:4 }else { System.out.println("查询结果为空。。。"); } } @Test public void testUpdate() throws Exception{ Article article = new Article(2,"显卡N","显卡是电脑的显示输出部件"); update(article, "title"); } @Test public void testDelete(){ } @Test public void testDeleteAll(){ }}
1 0
- Lucene学习-CRUD
- 【Lucene】Lucene中的CRUD
- Lucene学习笔记之(二)索引文档的CRUD
- lucene 建立CRUD操作
- Lucene-索引库的CRUD
- Lucene的常用操作详解,crud
- lucene 学习
- lucene 学习
- Lucene学习
- Lucene学习
- Lucene 学习
- Lucene学习
- lucene学习
- lucene 学习
- lucene学习
- lucene学习。
- Lucene学习
- Lucene学习
- LoginPanel
- 最大K乘积
- mac mysql 重置root密码
- QT:Qt多线程创建
- 尺取法
- Lucene学习-CRUD
- QT:Qt多线程同步
- Linux时间参数atime、ctime、mtime
- windows搭建spark运行环境(windows scala,hadoop,spark安装,idea使用配置等)
- 部署 instance 到 OVS vlan100
- 1031. 查验身份证(15)-PAT乙级
- QT:Qt 网络编程基础
- 创建 OVS vlan101 并部署 instance
- 分析 OVS 如何实现 vlan 隔离