博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lucene简单使用demo
阅读量:4668 次
发布时间:2019-06-09

本文共 10329 字,大约阅读时间需要 34 分钟。

测试结构目录:

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
searchFileUploadByCondition(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.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
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
elecFileUploadList = luceneUtils.searchFileUploadByCondition(queryString, projId, belongTo);System.out.println(elecFileUploadList);*//** * lucene调用全部代码 end */

效果:

 

转载于:https://www.cnblogs.com/super-chao/p/8631083.html

你可能感兴趣的文章
hdu 1003 Max Sum (DP)
查看>>
mysql增备
查看>>
[APIO2015]雅加达的摩天楼
查看>>
andorid之帧布局FrameLayout
查看>>
(转,记录用)jQuery页面加载初始化的3种方法
查看>>
C++常量的引用 const
查看>>
51nod 1101 换零钱 【完全背包变形/无限件可取】
查看>>
python单例设计模式(待补充)
查看>>
Binary Tree Inorder Traversal
查看>>
HDU 1394 Minimum Inversion Number (数据结构-线段树)
查看>>
ansible-playbook && Roles && include
查看>>
String s String s=null和String s="a"区别
查看>>
[Alpha阶段]第二次Scrum Meeting
查看>>
关于Java 8 forEach
查看>>
.NET设计模式(1):1.1 单例模式(Singleton Pattern)
查看>>
创建模态对话框和非模态对话框
查看>>
08-图8 How Long Does It Take
查看>>
二维数组中最大连通子数组
查看>>
java 正则表达式-忽略大小写与多行匹配
查看>>
mac 上亚马逊密钥登录
查看>>