• 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  

  • 相关阅读:
    java 中文排序 中文拼音排序 pinyin4j (怡,阿等) 拂晓风起
    jQuery 和 json 简单例子(注意callback函数的处理!!) (servlet返回json,jquery更新,java json) 拂晓风起
    推荐一个免费在线制作Banner的好地方
    Jquery焦点图/幻灯片效果 插件 KinSlideshow
    C#关于伪静态页面的两种实现方法
    cu3er 3D幻灯切换效果 div被遮住的解决方法
    推荐一个亲子教学网站,悟空学字
    怎么通过小米账号查出买家的手机号?
    添加网页桌面快捷方式的代码
    卖小米资格号怎么才不会受骗,怎么才不会淘宝退款?
  • 原文地址:https://www.cnblogs.com/E-star/p/4971812.html
Copyright © 2020-2023  润新知