package edu.dlnu.xeon.dao.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Formatter;
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.wltea.analyzer.lucene.IKQueryParser;
import org.wltea.analyzer.lucene.IKSimilarity;
import edu.dlnu.xeon.dao.HTMLIndexDao;
import edu.dlnu.xeon.domain.HTML;
import edu.dlnu.xeon.domain.QueryResult;
import edu.dlnu.xeon.util.HTMLDocumentUtils;
import edu.dlnu.xeon.util.LuceneUtils;
public class HTMLIndexDaoImpl implements HTMLIndexDao{
/**
* 保存javaBean到索引库
* @param HTML 要保存的javaBean
*/
public void save(HTML html){
Document doc=HTMLDocumentUtils.HTML2Document(html);
doc.setBoost(0.5F); // 1F表示正常得分,大于1表示高分,小于1表示低分
IndexWriter indexWriter=LuceneUtils.getIndexWriter();
try {
indexWriter.addDocument(doc);//添加
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void indexCommit() throws CorruptIndexException, IOException{
LuceneUtils.getIndexWriter().commit();
}
/**
* 分页查询
* @param queryString 执行查询的条件
* @param first 为刚开始查询的记录索引
* @param max 为查询的最大记录数
* @return
*/
public QueryResult<HTML> query(String queryString,QueryResult<HTML> result){
List<HTML> list=new ArrayList<HTML>();
//1.首先转换查询对象(从多个字段中查询),则要用到QueryParser的子类MultiFieldQueryParser
// QueryParser queryParser=new MultiFieldQueryParser(Version.LUCENE_30,new String[]{"title","content"}, LuceneUtils.getAnalyzer());
IndexSearcher indexSearcher=null;
int rowCount=0;
int first=result.getPageNow()*result.getPageSize();
try {
Query query=IKQueryParser.parseMultiField(new String[]{"title","description"}, queryString);
indexSearcher=new IndexSearcher(LuceneUtils.getDirectory());
indexSearcher.setSimilarity(new IKSimilarity());
Sort sort = new Sort(new SortField("title", SortField.STRING, true));//设置排序条件
TopDocs topDocs=indexSearcher.search(query,null,first+result.getPageSize(),sort);
// ========================================================================================== 【创建高亮器】
Query myQuery = query; // 查询条件
String preTag = "<font color='red'>"; // 前缀
String postTag = "</font>"; // 后缀
int size = 40; // 摘要大小
Formatter formatter = new SimpleHTMLFormatter(preTag, postTag); // 前缀、后缀
Scorer scorer = new QueryScorer(myQuery);
Highlighter highlighter = new Highlighter(formatter, scorer);
highlighter.setTextFragmenter(new SimpleFragmenter(size)); // 摘要大小(字数)
// ==========================================================================================
rowCount=topDocs.totalHits;
//2.返回中间过程处理结果
ScoreDoc[] scoreDocs=topDocs.scoreDocs;
HTML html=null;
//3.处理得到最终结果
int endIndex=Math.min(result.getPageSize()+first,scoreDocs.length);
for(int i=first;i<endIndex;i++){
int docId=scoreDocs[i].doc;
Document doc=indexSearcher.doc(docId);
// ======================================================================================== 【使用高亮器】
// 一次高亮一个字段,返回高亮后的结果,如果要高亮的字段值中没有出现关键字,就会返回null
String text = highlighter.getBestFragment(LuceneUtils.getAnalyzer(), "description", doc.get("description"));
if (text != null) {
doc.getField("description").setValue(text); // 使用高亮后的文本替换原始内容
}
text=highlighter.getBestFragment(LuceneUtils.getAnalyzer(), "title", doc.get("title"));
if (text != null) {
doc.getField("title").setValue(text);
}
// ========================================================================================
html=HTMLDocumentUtils.document2HTML(doc);
list.add(html);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(indexSearcher!=null){
try {
indexSearcher.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return new QueryResult<HTML>(list,rowCount);
}
public QueryResult<HTML> query(String queryString){
List<HTML> list=new ArrayList<HTML>();
//1.首先转换查询对象(从多个字段中查询),则要用到QueryParser的子类MultiFieldQueryParser
// QueryParser queryParser=new MultiFieldQueryParser(Version.LUCENE_30,, LuceneUtils.getAnalyzer());
IndexSearcher indexSearcher=null;
try {
Query query=IKQueryParser.parseMultiField(new String[]{"title","description"}, queryString);
indexSearcher=new IndexSearcher(LuceneUtils.getDirectory());
indexSearcher.setSimilarity(new IKSimilarity());
TopDocs topDocs=indexSearcher.search(query, 1000);
//2.返回中间过程处理结果
ScoreDoc[] scoreDocs=topDocs.scoreDocs;
HTML html=null;
//3.处理得到最终结果
for(ScoreDoc scoreDoc:scoreDocs){
int docId=scoreDoc.doc;
Document doc=indexSearcher.doc(docId);
html=HTMLDocumentUtils.document2HTML(doc);
list.add(html);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(indexSearcher!=null){
try {
indexSearcher.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return new QueryResult<HTML>(list);
}
/**
* 删除索引库中的记录
* Term为最小查询单位,查询某个字段的值
* @param id
*/
public void delete(Integer id){
IndexWriter indexWriter=null;
try {
//用唯一标示符id来删除,删除的一定是唯一的一条记录,根据目录区的索引来删除数据区中的记录
Term term=new Term("id", NumericUtils.intToPrefixCoded(id));
indexWriter=new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), MaxFieldLength.LIMITED);
indexWriter.deleteDocuments(term);//删除
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 更新索引
* 更新就是先删除后创建
* @param HTML
*/
public void update(HTML HTML){
Document doc=HTMLDocumentUtils.HTML2Document(HTML);
IndexWriter indexWriter=null;
try {
// Term term=new Term("id",NumericUtils.intToPrefixCoded(HTML.getId()));
// indexWriter=new IndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), MaxFieldLength.LIMITED);
// indexWriter.updateDocument(term, doc);//更新索引库中的记录
//indexWriter.deleteDocuments(term);
//indexWriter.addDocument(doc);//添加
} catch (Exception e) {
e.printStackTrace();
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于Hadoop平台的分布式搜索引擎的设计与实现+部署文档+全部资料 高分项目.zip
共116个文件
jar:70个
java:13个
jsp:9个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 157 浏览量
2024-05-13
18:09:38
上传
评论
收藏 45.62MB ZIP 举报
温馨提示
【资源说明】 基于Hadoop平台的分布式搜索引擎的设计与实现+部署文档+全部资料 高分项目.zip基于Hadoop平台的分布式搜索引擎的设计与实现+部署文档+全部资料 高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
基于Hadoop平台的分布式搜索引擎的设计与实现+部署文档+全部资料 高分项目.zip (116个子文件)
_1.cfs 811KB
_0.cfs 293KB
.classpath 834B
org.eclipse.wst.common.component 488B
org.eclipse.wst.jsdt.ui.superType.container 49B
index.css 1KB
ext_stopword.dic 153B
segments.gen 20B
.gitignore 8B
jruby-complete-1.6.5.jar 12.7MB
hadoop-core-1.2.1.jar 4.01MB
hadoop-core-1.0.0.jar 3.57MB
core-3.1.1.jar 3.4MB
hadoop-test-1.2.1.jar 2.98MB
hbase-0.92.0.jar 2.96MB
hbase-0.92.0-tests.jar 1.42MB
IKAnalyzer3.2.0Stable.jar 1.11MB
guava-r09.jar 1.09MB
lucene-core-3.0.3.jar 1010KB
jsp-2.1-6.1.14.jar 1001KB
snappy-java-1.0.3.2.jar 972KB
jaxb-impl-2.1.12.jar 847KB
commons-math-2.1.jar 813KB
netty-3.2.4.Final.jar 772KB
zookeeper-3.4.2.jar 747KB
jersey-server-1.4.jar 662KB
commons-collections-3.2.1.jar 562KB
jetty-6.1.26.jar 527KB
jackson-mapper-asl-1.5.5.jar 474KB
log4j-1.2.16.jar 470KB
jersey-core-1.4.jar 445KB
protobuf-java-2.4.0a.jar 439KB
velocity-1.7.jar 439KB
jasper-compiler-5.5.23.jar 399KB
hadoop-tools-1.2.1.jar 377KB
commons-httpclient-3.1.jar 298KB
libthrift-0.7.0.jar 294KB
jsoup-1.8.1.jar 294KB
commons-configuration-1.6.jar 292KB
httpclient-4.0.1.jar 284KB
commons-lang-2.5.jar 273KB
avro-1.5.3.jar 257KB
commons-lang-2.4.jar 256KB
commons-beanutils-core-1.8.0.jar 201KB
lucene-analyzers-3.0.3.jar 196KB
commons-beanutils-1.7.0.jar 184KB
commons-net-1.4.1.jar 177KB
jetty-util-6.1.26.jar 173KB
httpcore-4.0.1.jar 169KB
jackson-core-asl-1.5.5.jar 168KB
avro-ipc-1.5.3.jar 164KB
commons-digester-1.8.jar 140KB
jersey-json-1.4.jar 139KB
hadoop-examples-1.2.1.jar 139KB
jsp-api-2.1-6.1.14.jar 132KB
servlet-api-2.5-6.1.14.jar 129KB
commons-el-1.0.jar 110KB
servlet-api-2.5.jar 103KB
jaxb-api-2.1.jar 101KB
high-scale-lib-1.1.1.jar 94KB
jasper-runtime-5.5.23.jar 75KB
jettison-1.1.jar 66KB
activation-1.1.jar 62KB
commons-logging-1.1.1.jar 59KB
commons-codec-1.4.jar 57KB
lucene-highlighter-3.0.3.jar 46KB
asm-3.1.jar 42KB
commons-cli-1.2.jar 40KB
lucene-memory-3.0.3.jar 27KB
stax-api-1.0.1.jar 26KB
jackson-xc-1.5.5.jar 24KB
slf4j-api-1.5.8.jar 23KB
jamon-runtime-2.3.1.jar 20KB
jackson-jaxrs-1.5.5.jar 17KB
xmlenc-0.52.jar 15KB
slf4j-log4j12-1.5.8.jar 9KB
hadoop-ant-1.2.1.jar 7KB
hadoop-minicluster-1.2.1.jar 417B
hadoop-client-1.2.1.jar 414B
HTMLIndexDaoImpl.java 7KB
HBaseDaoImpl.java 6KB
PagingSearchServlet.java 2KB
LuceneUtils.java 2KB
QueryResult.java 1KB
SnapShotServlet.java 1KB
HTML.java 1KB
SearchServiceImpl.java 1KB
HTMLDocumentUtils.java 1KB
IndexServiceImpl.java 928B
SearchService.java 380B
HTMLIndexDao.java 353B
HBaseDao.java 180B
index_bg.jpg 347KB
404.jpg 164KB
index.js 834B
.jsdtscope 503B
pagingSearchResult.jsp 3KB
search.jsp 2KB
index.jsp 2KB
footer.jsp 1KB
共 116 条
- 1
- 2
资源评论
不走小道
- 粉丝: 3342
- 资源: 5059
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功