测试结构目录:
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 ListsearchFileUploadByCondition(String queryString,String projId,String belongTo) { List list = new ArrayList (); 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(" ",""); 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 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.javapackage 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.javapackage 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.javapackage 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 = ""; //使用搜索条件,从索引库中搜索出对应的结果 ListelecFileUploadList = 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 elecFileUploadList = luceneUtils.searchFileUploadByCondition(queryString, projId, belongTo);System.out.println(elecFileUploadList);*//** * lucene调用全部代码 end */
效果: