测试结构目录:
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 */
效果: