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
*/
效果:
lucene简单使用demo的更多相关文章
- lucene简单搜索demo
方法类 package com.wxf.Test; import com.wxf.pojo.Goods; import org.apache.lucene.analysis.standard.Stan ...
- C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo
在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架 ...
- Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(二)
然后是项目下的文件:完整的项目请看 上一篇 Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(一) 项目下的springmvc-servlet.xml配置文件: ...
- MEF简介及简单的Demo
MEF简介及简单的Demo 文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门 ...
- Spring源码学习:第1步--在Spring源码中添加最简单的Demo代码
为了最大程度地贴近Spring源码并进行学习,一种比较直接的做法是:直接在Spring源码中加入Demo代码,并进行调试. 参照以前使用Spring的经验,Spring最简单的使用方法是:一个实体类. ...
- Dubbo入门—搭建一个最简单的Demo框架
一.Dubbo背景和简介 1.电商系统的演进 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. a.单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一 ...
- Dubbo入门---搭建一个最简单的Demo框架(转)
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
- Dubbo简介---搭建一个最简单的Demo框架
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
- [MyBean说明书]-如何进行最简单的DEMO
MyBean是轻量级的.绿色的框架,不需要安装任何的组件和携带任何的其他文件,前 期步骤已经相当精简了,仔细阅读完下面简单的五个步骤,就可以编写基于MyBean的插件: 1.加入Delphi的搜索路径 ...
随机推荐
- C# Keywords - is
记录一下在日常开发过程中遇到的一些C# 基础编程的知识!希望以后能用的着.知识是在平常的开发过程中去学到的.只有用到了,你才能深入的理解它,并用好它. 本资料来源于:MSND下面是一些相关的code ...
- jQuery对象与DOM对象的区别
如何判断一个js对象是否一个DOM对象 我们在写js代码时有时需要判断某个对象是不是DOM对象,然后再进行后续的操作,这里我给出一种兼容各大浏览器,同时又算是比较稳妥的一种方法. 要判断一个对象是否D ...
- Android和IOS等效MD5加密
最近在Android和IOS上都需要对用户的某些输入进行简单的加密,于是采用MD5加密方式. 首先将目的字符串加密一次,获得32位字符串 然后将32位字符串拆为2段,分别加密1次 最后将加密后的2段拼 ...
- pgpool中的配置参数的定义
/* * configuration parameters */typedef struct { char *listen_addresses; /* hostnames/ ...
- Projective Texture Mapping - 投影纹理
昨天导师让写一个投影纹理,将一个相机渲染的图片的一部分投影到另外一个相机里面,目的是无缝的拼接. 投影纹理就和shadow map一样,都是将片元转换到另外一个相机/光源坐标系下,投影后找到对应的纹素 ...
- iOS保持流畅有哪些秘诀? 除了黑科技GPU还有这些重要原因 期待安卓8.0流畅度逆袭
经常有人提起iPhone使用起来要比Android手机流畅,现在谈谈为什么iOS使用中会让人觉得更加流畅一些.一方面iPhone的顶级硬件为iOS的流畅打好了基础,另一方面,专一定制的系统是保证体验的 ...
- Type system
Type system[edit] Main articles: Data type, Type system, and Type safety A type system defines how a ...
- 脚本_求和100以内的正整数.sh
#!bin/bash#功能:求和100以内的正整数#作者:liusingbon#seq 100 可以快速自动生成 100 个整数sum=0for i in $(seq 100)do sum=$[ ...
- zookeeper+kafka集群搭建
一.ZK集群安装. 解压安装包后进入conf目录,conf/zoo_sample.cfg拷贝一份命名为zoo.cfg,同时也放在conf下面. zookeeper配置文件: # The number ...
- hdu 1080 dp(最长公共子序列变形)
题意: 输入俩个字符串,怎样变换使其所有字符对和最大.(字符只有'A','C','G','T','-') 其中每对字符对应的值如下: 怎样配使和最大呢. 比如: A G T G A T G - G ...