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
 */

效果:

原文地址:https://www.cnblogs.com/super-chao/p/8631083.html