📄 topicimpl.java
字号:
/*
* Created on 2007-5-27
* Last modified on 2007-9-29
* Powered by GamVan.com
*/
package com.yeqiangwei.club.service.search.impl;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import com.yeqiangwei.club.exception.DAOException;
import com.yeqiangwei.club.param.TopicParameter;
import com.yeqiangwei.club.service.ServiceLocator;
import com.yeqiangwei.club.service.ServiceWrapper;
import com.yeqiangwei.club.service.model.ContentModel;
import com.yeqiangwei.club.service.model.TopicModel;
import com.yeqiangwei.club.service.search.AnalyzerFactory;
import com.yeqiangwei.club.service.search.Constants;
import com.yeqiangwei.club.service.search.MultiFiledQuery;
import com.yeqiangwei.club.service.search.SearchParameter;
import com.yeqiangwei.club.service.search.SearchProvider;
import com.yeqiangwei.club.service.search.SearchUtils;
import com.yeqiangwei.club.service.topic.TopicService;
import com.yeqiangwei.club.service.util.BasicInfoService;
import com.yeqiangwei.io.File;
import com.yeqiangwei.util.StringHelper;
import com.yeqiangwei.util.TypeChange;
import com.yeqiangwei.util.Validator;
public class TopicImpl extends SearchProvider<TopicModel>{
private static final Logger logger = Logger.getLogger(TopicImpl.class);
private static int CANSEARCH = 1;
private static String MINID_FILE = null;
private static String INDEXPATH_TOPIC = null;
private static String TEMPPATH_TOPIC = null;
static
{
if(INDEXPATH_TOPIC==null)INDEXPATH_TOPIC = getBasicService().findOnly().getIndexPath()+"topics"+File.separator;
if(TEMPPATH_TOPIC==null)TEMPPATH_TOPIC = Constants.INDEX_PATH+"topics"+File.separator;
if(MINID_FILE==null)MINID_FILE = Constants.INDEX_PATH+"topics.txt";
}
public static void main(String args[]){
com.yeqiangwei.club.dao.hibernate.ConnectionManager.init();
com.yeqiangwei.club.util.LanguageUtils.instance();
TopicImpl st = new TopicImpl();
st.createIndex(1);
System.out.println("Job over");
/*
List<TopicModel> list = st.results(1,30,"美女 喜欢");
for(int i=0; i<list.size(); i++){
TopicModel model = list.get(i);
System.out.println(model.getTitle());
System.out.println(model.getContentModel().getContent());
}*/
System.out.println("========================");
}
private TopicModel filter(TopicModel model){
com.yeqiangwei.club.dao.hibernate.ConnectionManager.beginTransaction();
/*
* 如果标题表topicId和内容表的不符则依据标题表topicId去查找内容
*
*/
int topicId = model.getTopicId();
ContentModel content = model.getContentModel();
if(Validator.isEmpty(content)){
model = this.getTopicService().findTopicAndContentById(topicId);
}else{
int ctopicId = content.getTopicId();
if(topicId!=ctopicId){
model = this.getTopicService().findTopicAndContentById(topicId);
if(this.getTopicService().findById(ctopicId)==null){ //找不到标题的内容
try {
this.getTopicService().getContentDAO().deleteByTopicId(ctopicId);
} catch (DAOException e) {
logger.error(e.toString());
}
}
}
}
com.yeqiangwei.club.dao.hibernate.ConnectionManager.commitTransaction();
return model;
}
private void addDocs(TopicModel model, IndexWriter writer) throws IOException
{
model = this.filter(model);
if(Validator.isEmpty(model)||Validator.isEmpty(model.getTitle())){
logger.warn("找不到帖子!");
}else{
/*
System.out.println(model.getTopicId()+":"+model.getContentModel().getTopicId());
System.out.println("======================================");
System.out.println("");
*/
//logger.debug("index topicId: "+model.getTopicId());
Document doc = new Document();
doc.add(SearchUtils.Text("topicId",model.getTopicId()));
doc.add(SearchUtils.Text("userId",model.getUserId()));
doc.add(SearchUtils.Text("userName",model.getUserName()));
doc.add(SearchUtils.Text("createDateTime",model.getCreateDateTime()));
doc.add(SearchUtils.Text("title",model.getTitle()));
doc.add(SearchUtils.Text("content",model.getContentModel().getContent()));
doc.add(SearchUtils.Text("forumId",model.getForumId()));
writer.addDocument(doc);
File.createFile(MINID_FILE,String.valueOf(model.getTopicId()),"gb2312",true);
}
}
public void createIndex(int auto) {
if(STATE==1){
logger.info("任务重复!");
return ;
}
STATE=1;
if(auto==1){ //自动判断是创建还是追加
int id = 0;
try {
String strId = File.readTxt(MINID_FILE,"gbk");
logger.info("MINID_FILE: "+strId);
id = TypeChange.stringToInt(strId);
} catch (IOException e) {
logger.error(e.toString());
}
if(id>0){
createIndex(false,id);
}else{
createIndex(true,id);
}
}else{ //强制重新生成索引
try {
File.createFile(MINID_FILE,"0","gbk",true);
createIndex(true,0);
} catch (IOException e) {
logger.error(e.toString());
}
}
STATE=2;
}
public void createIndex(boolean iscreate, int minId) {
try {
super.setProgress(SEARCH_TOPIC,0,0);
logger.info("索引创建开始!");
logger.debug(TEMPPATH_TOPIC);
int maxBufferedDocs = getBasicService().findOnly().getMaxBufferedDocs();
int mergeFactor = getBasicService().findOnly().getMergeFactor();
int maxFieldLength = getBasicService().findOnly().getMaxFieldLength();
logger.debug("maxBufferedDocs: "+maxBufferedDocs);
logger.debug("mergeFactor: "+mergeFactor);
logger.debug("maxFieldLength: "+maxFieldLength);
File.createFolder(TEMPPATH_TOPIC);
IndexWriter writer = SearchUtils.getIndexWriter(TEMPPATH_TOPIC, iscreate);
writer.setMaxBufferedDocs(maxBufferedDocs); // Defalut 10
writer.setMergeFactor(mergeFactor); // Defalut 10
writer.setMaxFieldLength(maxFieldLength);
int rows = 200;
TopicParameter param = new TopicParameter();
param.setIsDeleted(false);
param.setOrderBy(new Byte((byte) 4));
param.setRows(new Integer(rows));
param.setMinId(new Integer(minId));
logger.info("rows: "+rows);
logger.info("minId: "+minId);
long count = this.getTopicService().countByParameter(param);
int pages = (int) (count/rows);
if(count%rows!=0){
pages++;
}
if(pages==0&&count>0){
pages = 1;
}
logger.info("pages: "+pages);
int indexed = 0; //完成索引的个数
outer:
for(int page=1; page<=pages; page++){
param.setPage(new Integer(page));
List<TopicModel> list = this.getTopicService().findByParameter(param);
List<ContentModel> clist = this.getTopicService().findContentByParameter(param);
if(!Validator.isEmpty(list)&&!Validator.isEmpty(clist)){
if(list.size()==clist.size()){
for(int i=0; i<list.size(); i++){
TopicModel model = list.get(i);
ContentModel cmodel = clist.get(i);
model.setContentModel(cmodel);
this.addDocs(model,writer);
indexed++;
super.setProgress(SEARCH_TOPIC,count,indexed);
if(Constants.STOP==1){
STATE = 0;
break outer;
}
}
}else{
logger.warn("==============================");
logger.warn("取出的文章标题数和文章内容不符");
logger.warn("文章数:"+list.size());
logger.warn("内容数:"+clist.size());
logger.warn("当前页:"+page);
logger.warn("==============================");
for(int i=0; i<list.size(); i++){
TopicModel model = list.get(i);
this.addDocs(model,writer);
if(Constants.STOP==1){
STATE = 0;
break outer;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -