• lucene简单使用demo


    测试结构目录:

    1.索引库、分词器

    Configuration.java

    package com.test.www.web.lucene;
    
    import java.io.File;
    
    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.wltea.analyzer.lucene.IKAnalyzer;
    
    public class Configuration {
    
        //索引库的目录位置
        private static Directory directory;
        //分词器
        private static Analyzer analyzer;
        
        static{
            try {
                /**索引库目录为D盘indexDir*/
                directory = FSDirectory.open(new File("D:/indexDir/"));
                /**词库分词*/
                analyzer = new IKAnalyzer();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        public static Directory getDirectory() {
            return directory;
        }
        public static Analyzer getAnalyzer() {
            return analyzer;
        }
        
    }

    2.文档、实体转换

    FileUploadDocument.java

    package com.test.www.web.lucene;
    
    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.util.NumericUtils;
    
    public class FileUploadDocument {
    
        /**将ElecFileUpload对象转换成Document对象*/
        public static Document FileUploadToDocument(ElecFileUpload elecFileUpload){
            Document document = new Document();
            String seqId = NumericUtils.intToPrefixCoded(elecFileUpload.getSeqId());
            //主键ID
            document.add(new Field("seqId",seqId,Store.YES,Index.NOT_ANALYZED));
            //文件名
            document.add(new Field("fileName", elecFileUpload.getFileName(), Store.YES, Index.ANALYZED));
            //文件描述
            document.add(new Field("comment", elecFileUpload.getComment(), Store.YES, Index.ANALYZED));
            //所属单位
            document.add(new Field("projId",elecFileUpload.getProjId(),Store.YES,Index.NOT_ANALYZED));
            //图纸类别
            document.add(new Field("belongTo",elecFileUpload.getBelongTo(),Store.YES,Index.NOT_ANALYZED));
            return document;
        }
        
        /**将Document对象转换成ElecFileUpload对象*/
        public static ElecFileUpload documentToFileUpload(Document document){
            ElecFileUpload elecFileUpload = new ElecFileUpload();
            Integer seqId = NumericUtils.prefixCodedToInt(document.get("seqId"));
            //主键ID
            elecFileUpload.setSeqId(seqId);
            //文件名
            elecFileUpload.setFileName(document.get("fileName"));
            //文件描述
            elecFileUpload.setComment(document.get("comment"));
            //所属单位
            elecFileUpload.setProjId(document.get("projId"));
            //图纸类别
            elecFileUpload.setBelongTo(document.get("belongTo"));
            return elecFileUpload;
        }
    }

    3.lucene工具类

    LuceneUtils.java

    package com.test.www.web.lucene;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.commons.lang.StringUtils;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.queryParser.MultiFieldQueryParser;
    import org.apache.lucene.queryParser.QueryParser;
    import org.apache.lucene.search.BooleanClause.Occur;
    import org.apache.lucene.search.BooleanQuery;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.search.ScoreDoc;
    import org.apache.lucene.search.TermQuery;
    import org.apache.lucene.search.TopDocs;
    import org.apache.lucene.search.highlight.Formatter;
    import org.apache.lucene.search.highlight.Fragmenter;
    import org.apache.lucene.search.highlight.Highlighter;
    import org.apache.lucene.search.highlight.QueryScorer;
    import org.apache.lucene.search.highlight.Scorer;
    import org.apache.lucene.search.highlight.SimpleFragmenter;
    import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
    import org.apache.lucene.util.NumericUtils;
    import org.apache.lucene.util.Version;
    
    public class LuceneUtils {
    
        /**向索引库中新增数据*/
        public void saveFileUpload(ElecFileUpload elecFileUpload) {
            Document document = FileUploadDocument.FileUploadToDocument(elecFileUpload);
            try {
                IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_36,Configuration.getAnalyzer());
                IndexWriter indexWriter = new IndexWriter(Configuration.getDirectory(),indexWriterConfig);
                indexWriter.addDocument(document);
                indexWriter.close();
            } catch (Exception e) {
                throw new RuntimeException();
            }
        }
        
        /**索引库中删除数据*/
        public void deleteFileUploadByID(Integer seqId) {
            //指定词条的最小单位,相当于id=1
            String id = NumericUtils.intToPrefixCoded(seqId);
            Term term = new Term("seqId", id);
            try {
                IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_36,Configuration.getAnalyzer());
                IndexWriter indexWriter = new IndexWriter(Configuration.getDirectory(),indexWriterConfig);
                indexWriter.deleteDocuments(term);
                indexWriter.close();
            } catch (Exception e) {
                e.printStackTrace();
            } 
            
        }
    
        /**使用搜索条件,从索引库中搜索出对应的结果*/
        public List<ElecFileUpload> searchFileUploadByCondition(String queryString,String projId,String belongTo) {
            List<ElecFileUpload> list = new ArrayList<ElecFileUpload>();
            try {
                IndexSearcher indexSearcher = new IndexSearcher(IndexReader.open(Configuration.getDirectory()));
                //指定查询条件在文件名称和文件描述、所属单位、图纸类别的字段上进行搜索
                QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_36,new String[]{"fileName","comment"},Configuration.getAnalyzer());
                /**使用lucene的多条件查询,即boolean查询,即必须满足3个条件*/
                BooleanQuery booleanQuery = new BooleanQuery();
                //【按文件名称和描述搜素】搜素的条件
                if(StringUtils.isNotBlank(queryString)){
                    Query query1 = queryParser.parse(queryString);
                    booleanQuery.add(query1,Occur.MUST);
                }
                //【所属单位】搜素的条件
                if(StringUtils.isNotBlank(projId)){
                    Query query2 = new TermQuery(new Term("projId", projId));
                    booleanQuery.add(query2, Occur.MUST);
                }
                //【图纸类别】搜素的条件
                if(StringUtils.isNotBlank(belongTo)){
                    Query query3 = new TermQuery(new Term("belongTo", belongTo));
                    booleanQuery.add(query3, Occur.MUST);
                }
                //返回前100条数据
                TopDocs topDocs = indexSearcher.search(booleanQuery, 100);
                //返回结果集
                ScoreDoc [] scoreDocs = topDocs.scoreDocs;
                /**设置高亮效果 begin*/
                Formatter formatter = new SimpleHTMLFormatter("<font color='red'>","</font>");
                Scorer scorer = new QueryScorer(booleanQuery);
                Highlighter highlighter = new Highlighter(formatter,scorer);
                //摘要大小(设置大点,最好比文件名大,因为文件名最好不要截取)
                int fragmentSize = 50;
                Fragmenter fragmenter = new SimpleFragmenter(fragmentSize);
                highlighter.setTextFragmenter(fragmenter);
                /**设置高亮效果 end*/
                if(scoreDocs!=null && scoreDocs.length>0){
                    for(int i=0;i<scoreDocs.length;i++){
                        ScoreDoc scoreDoc = scoreDocs[i];
                        //使用内部惟一编号,获取对应的数据,编号从0开始
                        Document document = indexSearcher.doc(scoreDoc.doc);
                        /**获取高亮效果begin*/
                        /**返回文件名的高亮效果*/
                        String fileNameText = highlighter.getBestFragment(Configuration.getAnalyzer(), "fileName", document.get("fileName"));
                        //没有高亮的效果
                        if(fileNameText==null){
                            fileNameText = document.get("fileName");
                            if(fileNameText!=null && fileNameText.length()>fragmentSize){
                                fileNameText = fileNameText.substring(0, fragmentSize);
                            }
                        }
                        document.getField("fileName").setValue(fileNameText);
                        /**返回文件描述的高亮效果*/
                        String commentText = highlighter.getBestFragment(Configuration.getAnalyzer(), "comment", document.get("comment"));
                        //没有高亮的效果
                        if(commentText==null){
                            commentText = document.get("comment");
                            if(commentText!=null && commentText.length()>fragmentSize){
                                commentText = commentText.substring(0, fragmentSize);
                            }
                        }
                        document.getField("comment").setValue(commentText);
                        /**获取高亮效果end*/
                        //将Document转换成ElecFileUpload
                        ElecFileUpload elecFileUpload = FileUploadDocument.documentToFileUpload(document);
                        list.add(elecFileUpload);
                    }
                }
            } catch (Exception e) {
                throw new RuntimeException();
            }
            
            return list;
        }
    }

    4.新增索引
    TestIndexAdd.java

    package com.test.www.web.lucene;
    
    public class TestIndexAdd {
        /**
         * 数据新增
         */
        public static void main(String[] args) {
            //TODO 数据库新增记录
            
            //同时向索引库中新增记录
            ElecFileUpload elecFileUpload = new ElecFileUpload();
            LuceneUtils luceneUtils = new LuceneUtils();
            elecFileUpload.setBelongTo("111");
            elecFileUpload.setSeqId(11);
            elecFileUpload.setFileName("春宫图");
            elecFileUpload.setComment("这是一本很神奇的书");
            elecFileUpload.setProjId("EAS");
            //向索引库中新增数据
            luceneUtils.saveFileUpload(elecFileUpload);
        }
    
    }

    5.删除索引:
    TestIndexDelete.java

    package com.test.www.web.lucene;
    
    public class TestIndexDelete {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            //TODO 数据库中删除记录
            
            //索引库中删除数据
            LuceneUtils luceneUtils = new LuceneUtils();
            luceneUtils.deleteFileUploadByID(11);
        }
    
    }

    6.测试类:
    Test.java

    package com.test.www.web.lucene;
    
    import java.util.List;
    
    public class Test {
        /**
         * @param args
         */
        public static void main(String[] args) {
            LuceneUtils luceneUtils = new LuceneUtils();
            String queryString = "神奇春宫图11232322";
            String projId = "EAS";
            String belongTo = "";
            //使用搜索条件,从索引库中搜索出对应的结果
            List<ElecFileUpload> elecFileUploadList = luceneUtils.searchFileUploadByCondition(queryString, projId, belongTo);
            System.out.println(elecFileUploadList);
        }
    }
    
    /**
     * lucene调用全部代码 start
     */
    /*ElecFileUpload elecFileUpload = new ElecFileUpload();
    LuceneUtils luceneUtils = new LuceneUtils();
    elecFileUpload.setBelongTo("111");
    elecFileUpload.setSeqId(11);
    elecFileUpload.setFileName("春宫图");
    elecFileUpload.setComment("这是一本很神奇的书");
    elecFileUpload.setProjId("EAS");
    //向索引库中新增数据
    luceneUtils.saveFileUpload(elecFileUpload);
    
    String queryString = "";
    String projId = "EAS";
    String belongTo = "";
    //使用搜索条件,从索引库中搜索出对应的结果
    List<ElecFileUpload> elecFileUploadList = luceneUtils.searchFileUploadByCondition(queryString, projId, belongTo);
    System.out.println(elecFileUploadList);*/
    /**
     * lucene调用全部代码 end
     */

    效果:

  • 相关阅读:
    Android -- Camera2(Android5.0)
    Android -- Camera.ShutterCallback
    Android -- selector&&StateListDrawable
    Centos安装FTP服务器和配置
    Android -- setWillNotDraw()
    Android -- ViewPager切换动画,PageTransformer
    关于通信的关键词UDP/(TCP/IP)/IPC/RPC/.NET Remoting/WebService/WCF/Http 系列
    已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。
    JavaScript的NaN-唯一 一个自己不等于自己的对象!!
    【ShoppingPeeker】-基于Webkit内核的爬虫蜘蛛引擎 ShoppingWebCrawler的姊妹篇-可视化任务Web管理
  • 原文地址:https://www.cnblogs.com/super-chao/p/8631083.html
Copyright © 2020-2023  润新知