Lucene入门级笔记二 -- 索引库的CRUD API 演示 .
Lucene 对索引库的增删改查操作的 API 演示
没什么说的,apache 的 API 一向简单、不难理解。所以直接拷代码过去稍微看一下就差不多了。
/** * "文章" 实体 */ public class Article { private Integer id; private String title; private String content; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } } /** * 描述某一页的检索结果集 */ public class QueryResult { /* 匹配的总记录数 */ private int totalCount; /* 检索到的文章对象集合 */ private List<Article> atrticle; public QueryResult(int totalCount, List<Article> atrticle) { this.totalCount = totalCount; this.atrticle = atrticle; } public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public List<Article> getAtrticle() { return atrticle; } public void setAtrticle(List<Article> atrticle) { this.atrticle = atrticle; } } /** * 直接操作索引库的 DAO */ public class ArticleIndexDao { /** * 保存索引 * @param article */ public void save(Article article) { Document document = Article2DocumentUtil.article2document(article); IndexWriter indexWriter = null; try { Directory indexDir = FSDirectory.open(new File("./indexDir/")); // 标准分词器,另外 Lucene 还提供了针对多种语言的分词器 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30); indexWriter = new IndexWriter(indexDir, analyzer, MaxFieldLength.LIMITED); indexWriter.addDocument(document); } catch (IOException e) { throw new RuntimeException(e); } finally { if (indexWriter != null) { try { indexWriter.close(); } catch (IOException e) { throw new RuntimeException(e); } } } } /** * 删除 * * @param article * 删除的 Article 对象 */ public void delete(Article article) { IndexWriter indexWriter = null; try { Directory indexDir = FSDirectory.open(new File("./indexDir/")); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30); indexWriter = new IndexWriter(indexDir, analyzer, MaxFieldLength.LIMITED); /* 意思是将索引库中 id 为 article.getId() 的记录删了 */ Term term = new Term("id", article.getId() + ""); indexWriter.deleteDocuments(term); } catch (IOException e) { throw new RuntimeException(e); } finally { if (indexWriter != null) { try { indexWriter.close(); } catch (IOException e) { throw new RuntimeException(e); } } } } /** * 修改 */ public void update(Article article) { IndexWriter indexWriter = null; try { Directory indexDir = FSDirectory.open(new File("./indexDir/")); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30); indexWriter = new IndexWriter(indexDir, analyzer, MaxFieldLength.LIMITED); /* 意思是将索引库中 id 为 article.getId() 的记录改了 */ Term term = new Term("id", article.getId() + ""); indexWriter.updateDocument(term, Article2DocumentUtil .article2document(article)); /* * updateDocument 等价于: delete(article); save(article); * 在大数据量的时候,采用 "删除再创建" 的效率更高 */ } catch (IOException e) { throw new RuntimeException(e); } finally { if (indexWriter != null) { try { indexWriter.close(); } catch (IOException e) { throw new RuntimeException(e); } } } } /** * 分页搜索 * @param queryStr 搜索条件 * @param firstResult 首条数据位置 * @param maxResults 最多取多少条数据 * @return 一页结果集 */ public QueryResult search(String queryStr, int firstResult, int maxResults) { IndexSearcher indexSearcher = null; List<Article> atrticles = new ArrayList<Article>(); try { /* * 构建 IndexSearcher */ Directory indexDir = FSDirectory.open(new File("./indexDir/")); indexSearcher = new IndexSearcher(indexDir); /* * 构建 Query */ Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30); QueryParser queryParser = new QueryParser(Version.LUCENE_30, "content", analyzer); Query query = queryParser.parse(queryStr); /* * 查询 */ TopDocs topDocs = indexSearcher.search(query, firstResult + maxResults); int totalCount = topDocs.totalHits; ScoreDoc[] scoreDocs = topDocs.scoreDocs; /* 保证循环的次数不超过 scoreDocs 的长度*/ int length = Math.min(firstResult+maxResults, scoreDocs.length); for(int i=firstResult; i<length; i++) { /* * 根据编号取出Document数据 */ Document document = indexSearcher.doc(i); Article article = Article2DocumentUtil.document2article(document); atrticles.add(article); } return new QueryResult(totalCount, atrticles); } catch (Exception e) { throw new RuntimeException(e); } finally { try { if (indexSearcher != null) { indexSearcher.close(); } } catch (IOException e) { throw new RuntimeException(e); } } } } ** * 工具类:Article 对象与 Document 对象的转换 */ public class Article2DocumentUtil { public static Document article2document(Article article) { if(article == null) { return null; } Document document = new Document(); document.add(new Field("id", article.getId()+"", Store.YES, Index.ANALYZED)); document.add(new Field("title", article.getTitle(), Store.YES, Index.ANALYZED)); document.add(new Field("content", article.getContent(), Store.YES, Index.ANALYZED)); return document; } public static Article document2article(Document document) { if(document == null) { return null; } Article article = new Article(); article.setId(Integer.parseInt(document.get("id"))); article.setTitle(document.get("title")); article.setContent(document.get("content")); return article; } } /** * JUnit 测试 */ public class TestArticleIndexDao { /** * 测试保存 * @throws Exception */ @Test public void testSave() throws Exception { ArticleIndexDao dao = new ArticleIndexDao(); Article article = new Article(); article.setId(1); article.setTitle("wjh上天山"); article.setContent("据悉,文建华已于昨日抵达天山。高歌一曲HelloWorld"); dao.save(article); } @Test public void testBatchSave() throws Exception { for(int i=0; i<35; i++) { ArticleIndexDao dao = new ArticleIndexDao(); Article article = new Article(); article.setId(i); article.setTitle("wjh上天山第" + i + "集"); article.setContent("据悉,wjh已于昨日抵达天山。高歌"+ i +"曲 HelloWorld"); dao.save(article); } } @Test public void testUpdate() throws Exception { ArticleIndexDao dao = new ArticleIndexDao(); Article article = new Article(); article.setId(1); article.setTitle("wjh上天山"); article.setContent("wjh已于昨日抵达天山。高歌一曲HelloWorld"); dao.update(article); } @Test public void testDel() throws Exception { ArticleIndexDao dao = new ArticleIndexDao(); Article article = new Article(); article.setId(1); article.setTitle("wjh上天山"); article.setContent("wjh已于昨日抵达天山。高歌一曲HelloWorld"); dao.delete(article); } @Test public void testSearch() throws Exception { ArticleIndexDao dao = new ArticleIndexDao(); QueryResult queryResult = dao.search("HelloWorld", 30, 10); int count = queryResult.getTotalCount(); System.out.println("共匹配了 " + count + " 条记录。"); List<Article> articles = queryResult.getAtrticle(); for (Article article : articles) { System.out.println("id:" + article.getId()); System.out.println("title:" + article.getTitle()); System.out.println("content:" + article.getContent()); System.out.println("----------------"); } } }
相关推荐
ribavnu 2020-11-16
moyekongling 2020-11-13
坚持是一种品质 2020-11-16
chenjiazhu 2020-09-29
kikaylee 2020-10-31
Ida 2020-09-16
liuweiq 2020-09-09
silencehgt 2020-09-07
sunnyxuebuhui 2020-09-07
西瓜皮儿的皮儿 2020-09-07
LuckyLXG 2020-09-08
明瞳 2020-08-19
MissFuTT 2020-08-18
jzlixiao 2020-08-18
zhushenghan 2020-08-16
罗罗 2020-08-16
mrandy 2020-08-15
houdaxiami 2020-08-15