• Lucene的快速入门


    Lucene快速入门代码

    package cn.itcast.javaee.lucene.firstapp;
    
    import cn.itcast.javaee.lucene.entity.Article;
    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.document.Field.Store;
    import org.apache.lucene.document.Field.Index;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriter.MaxFieldLength;
    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.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.apache.lucene.util.Version;
    import org.junit.Test;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    
    
    public class FirstApp {
    
        @Test
        //创建词汇索引库!
        public void createIndexDB() throws Exception{
            //创建实体对象
            Article article = new Article(1,"培训","是一个培训机构");
    
            //创建文本对象
            Document document = new Document();
            /*Store.YES 存储到词库中*/
            /*Index.ANALYZED) 分词*/
            /*name名称可以与实体对象的属性名一一对应也可以不对应*/
            document.add(new Field("xid",article.getId().toString(),Store.YES, Index.ANALYZED));
            document.add(new Field("xtitle",article.getTitle(),Store.YES, Index.ANALYZED));
            document.add(new Field("xcontent",article.getContent(),Store.YES, Index.ANALYZED));
    
    
            //将document对象写入Lucene索引库
            Directory directory = FSDirectory.open(new File("E:/indexDBDBDB"));   //索引库存放硬盘的位置
    
            //Ctrl+alt+b 查看一个接口的所有实现类
            Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);  //采用什么策略来拆分文字 参数为采用指定的版本
    
            MaxFieldLength maxFieldLength= IndexWriter.MaxFieldLength.LIMITED; //最将文本拆分多少个词汇 limited可以最多拆分1万个词
    
            IndexWriter indexWriter = new IndexWriter(directory,analyzer,maxFieldLength);
            //将文本对象document写入lucene索引库中
            indexWriter.addDocument(document);
    
            //关闭资源
            indexWriter.close();
    
        }
    
    
    
    
        //创建查询 从索引库中查询符合条件的数据
        @Test
        public void findIndexDB() throws Exception{
            String keywords = "培训";
            List<Article> articleList = new ArrayList<Article>();
            //将document对象写入Lucene索引库
            Directory directory = FSDirectory.open(new File("E:/indexDBDBDB"));   //索引库存放硬盘的位置
            Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);  //采用什么策略来拆分文字 参数为采用指定的版本
    
    
            //创建indexSwarcher流对象
            IndexSearcher indexSearcher = new IndexSearcher(directory); //寻找词库的位置
    
            //创建查询对象
            /*对应的参数意思是: 1版本号, 2搜索的范围只再document中的Xcontent文本类搜索,3用的是那种解析器s*/
            QueryParser queryParser = new QueryParser(Version.LUCENE_30,"xcontent",analyzer);
            Query query = queryParser.parse(keywords);
    
            /*如果搜索出来的关键数据过多 只取出来Max_Record对应值的个数*/
            int MAX_RECORD = 100;
            TopDocs topDocs = indexSearcher.search(query, MAX_RECORD);
    
            for(int i = 0; i<topDocs.scoreDocs.length; i++){
                //取出每一个编号
                ScoreDoc scoreDoc = topDocs.scoreDocs[i];
                int no = scoreDoc.doc;
    
                //封装到doc中
                Document document = indexSearcher.doc(no);
                String xid = document.get("xid");
                String xtitle = document.get("xtitle");
                String xcontent = document.get("xcontent");
    
                //封装到Artilce bean对象中
                Article article = new Article(Integer.parseInt(xid),xtitle,xcontent);
                articleList.add(article);
            }
            //遍历搜索到内容集合
            for(Article a :articleList){
                System.out.println(a);
            }
        }
    }

    Lucene的增删改查

    package cn.itcast.javaee.lucene.crud;
    
    
    import cn.itcast.javaee.lucene.entity.Article;
    import cn.itcast.javaee.lucene.utils.LuceneUtil;
    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    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.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.apache.lucene.util.Version;
    import org.junit.Test;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    
    /*增删改查*/
    public class ArticleDao {
    
        @Test
        public void add() throws Exception{
            Article article = new Article(1,"培训","传智是一家java培训机构");
            //创建文本对象
            Document document = new Document();
            document.add(new Field("id",article.getId().toString(), Field.Store.YES, Field.Index.ANALYZED));
            document.add(new Field("title",article.getTitle(), Field.Store.YES, Field.Index.ANALYZED));
            document.add(new Field("content",article.getContent(), Field.Store.YES, Field.Index.ANALYZED));
    
            Directory directory = FSDirectory.open(new File("E:/indexDBDBDB")); //Field.Store.YES
            Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
            IndexWriter.MaxFieldLength maxFieldLength = IndexWriter.MaxFieldLength.LIMITED;
    
            //创建indexWriter对象
            IndexWriter indexWriter = new IndexWriter(directory,analyzer,maxFieldLength);
            indexWriter.addDocument(document);
            indexWriter.close();
    
        }
    
        @Test
        public void addAll() throws Exception{
            IndexWriter indexWriter = new IndexWriter(LuceneUtil.getDirectory(),LuceneUtil.getAnalyzer(),LuceneUtil.getMaxFieldLength());
    
            Article article1 = new Article(1,"培训","传智是一家java培训机构");
            Document document1 = LuceneUtil.javabean2document(article1);
            indexWriter.addDocument(document1);
    
            Article article2 = new Article(2,"培训","传智是一家net培训机构");
            Document document2 = LuceneUtil.javabean2document(article2);
            indexWriter.addDocument(document2);
    
            Article article3 = new Article(3,"培训","传智是一家php培训机构");
            Document document3 = LuceneUtil.javabean2document(article3);
            indexWriter.addDocument(document3);
    
    
            Article article4 = new Article(4,"培训","传智是一家ios培训机构");
            Document document4 = LuceneUtil.javabean2document(article4);
            indexWriter.addDocument(document4);
    
            Article article5 = new Article(5,"培训","传智是一家ui培训机构");
            Document document5 = LuceneUtil.javabean2document(article5);
            indexWriter.addDocument(document5);
    
            Article article6 = new Article(6,"培训","传智是一家c++培训机构");
            Document document6 = LuceneUtil.javabean2document(article6);
            indexWriter.addDocument(document6);
    
            Article article7 = new Article(7,"培训","传智是一家c培训机构");
            Document document7 = LuceneUtil.javabean2document(article7);
            indexWriter.addDocument(document7);
    
            indexWriter.close();
        }
    
        @Test
        public void update() throws Exception{
            Article newArticle7 = new Article(7,"培训","传智是一家s培训机构");
            Document document = LuceneUtil.javabean2document(newArticle7);
    
            IndexWriter indexWriter = new IndexWriter(LuceneUtil.getDirectory(),LuceneUtil.getAnalyzer(),LuceneUtil.getMaxFieldLength());
            indexWriter.updateDocument(new Term("id","7"),document);
    
            indexWriter.close();
        }
    
    
        @Test
        public void delete() throws Exception{
            IndexWriter indexWriter = new IndexWriter(LuceneUtil.getDirectory(),LuceneUtil.getAnalyzer(),LuceneUtil.getMaxFieldLength());
            indexWriter.deleteDocuments(new Term("id","7"));
            indexWriter.close();
        }
    
        public void deleteAll() throws Exception{
            IndexWriter indexWriter = new IndexWriter(LuceneUtil.getDirectory(),LuceneUtil.getAnalyzer(),LuceneUtil.getMaxFieldLength());
            indexWriter.deleteAll();
            indexWriter.close();
        }
    
    
    
        @Test
        public void findAll() throws Exception{
            String keywords = "培训";
            List<Article> articleList = new ArrayList<Article>();
            //将document对象写入Lucene索引库
            Directory directory = FSDirectory.open(new File("E:/indexDBDBDB"));   //索引库存放硬盘的位置
            Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);  //采用什么策略来拆分文字 参数为采用指定的版本
    
            //创建indexSwarcher流对象
            IndexSearcher indexSearcher = new IndexSearcher(directory); //寻找词库的位置
            //创建查询对象
            /*对应的参数意思是: 1版本号, 2搜索的范围只再document中的Xcontent文本类搜索,3用的是那种解析器s*/
            QueryParser queryParser = new QueryParser(Version.LUCENE_30,"content",analyzer);
            Query query = queryParser.parse(keywords);
    
            /*如果搜索出来的关键数据过多 只取出来Max_Record对应值的个数*/
            int MAX_RECORD = 100;
            TopDocs topDocs = indexSearcher.search(query, MAX_RECORD);
    
            for(int i = 0; i<topDocs.scoreDocs.length; i++){
                //取出每一个编号
                ScoreDoc scoreDoc = topDocs.scoreDocs[i];
                int no = scoreDoc.doc;
    
                //封装到doc中
                Document document = indexSearcher.doc(no);
                String id = document.get("id");
                String title = document.get("title");
                String content = document.get("content");
    
                //封装到Artilce bean对象中
                Article article = new Article(Integer.parseInt(id),title,content);
                articleList.add(article);
            }
            //遍历搜索到内容集合
            for(Article a :articleList){
                System.out.println(a);
            }
        }
    }

    LuceneUtil

    package cn.itcast.javaee.lucene.util;
    
    import java.io.File;
    import java.lang.reflect.Method;
    import org.apache.commons.beanutils.BeanUtils;
    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.analysis.cjk.CJKAnalyzer;
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.document.Field.Index;
    import org.apache.lucene.document.Field.Store;
    import org.apache.lucene.index.IndexWriter.MaxFieldLength;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.apache.lucene.util.Version;
    
    /**
     * 工具类
     * @author AdminTC
     */
    public class LuceneUtil {
        
        private static Directory directory;
        private static Version version;
        private static Analyzer analyzer;
        private static MaxFieldLength maxFieldLength;
        
        static{
            try {
                directory =  FSDirectory.open(new File("E:/IndexDBDBDB"));
                version = Version.LUCENE_30;
                analyzer = new StandardAnalyzer(version);
                maxFieldLength = MaxFieldLength.LIMITED;
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        
        public static Directory getDirectory() {
            return directory;
        }
    
        public static Version getVersion() {
            return version;
        }
    
        public static Analyzer getAnalyzer() {
            return analyzer;
        }
    
        public static MaxFieldLength getMaxFieldLength() {
            return maxFieldLength;
        }
    
        //不让外界new该帮助类
        private LuceneUtil(){}    
        
        //将JavaBean转成Document对象
        public static Document javabean2document(Object obj) throws Exception{
            //创建Docuemnt对象
            Document document = new Document();
            //获取obj引用的对象字节码
            Class clazz = obj.getClass();
            //通过对象字节码获取私有的属性
            java.lang.reflect.Field[] reflectFields = clazz.getDeclaredFields();
            //迭代
            for(java.lang.reflect.Field reflectField : reflectFields){
                //强力反射
                reflectField.setAccessible(true);
                //获取属性名,id/title/content
                String name = reflectField.getName();
                //人工拼接方法名
                String methodName = "get" + name.substring(0,1).toUpperCase()+name.substring(1);
                //获取方法,例如:getId()/getTitle()/getContent()
                Method method = clazz.getMethod(methodName,null);
                //执行方法
                String value = method.invoke(obj,null).toString();
                //加入到Document对象中去,这时javabean的属性与document对象的属性相同
                document.add(new Field(name,value,Store.YES,Index.ANALYZED));
            }
            //返回document对象
            return document;
        }
        
        //将Document对象转成JavaBean对象
        public static Object document2javabean(Document document,Class clazz) throws Exception{
            Object obj = clazz.newInstance();
            java.lang.reflect.Field[] reflectFields = clazz.getDeclaredFields();
            for(java.lang.reflect.Field reflectField : reflectFields){
                reflectField.setAccessible(true);
                String name = reflectField.getName();//id/title/content
                String value = document.get(name);//1/培训/传智是一家培训机构
                BeanUtils.setProperty(obj,name,value);//封装javabean对应的属性中去,通过setXxx()方法
            }
            return obj;
        }
    
        
    }
    View Code
    坚持
  • 相关阅读:
    详解Oracle临时表的几种用法及意义
    Testing and Debugging Procedures using SQL Developer 3.1
    ORACLE 流复制
    ORA01017 invalid username/password; logon denied
    oracle数据类型
    使用Pls_Integer的好处
    js取得上传图片大小
    高效整洁CSS代码原则
    在线压缩js和css
    图片等比例缩放后裁切
  • 原文地址:https://www.cnblogs.com/gaoSJ/p/12942268.html
Copyright © 2020-2023  润新知