最新SH、Lucene3、IKAnalyzer3.2.3整合实例
Spring3.1, Hibernate3.6,Lucene3.0.3以及IKAnalyzer3.2.3, 数据库采用Mysql,连接池采用dbcp.主要Jar如下:
Spring重要Bean配置:
<!--配置定时任务 --><bean id="bagnetTask"/></property><property name="targetMethod"><value>runJobs</value></property><!-- keep the job from running while the previous one hasn't finished yet --><property name="concurrent" value="false" /></bean><!--配置定时任务触发器 --><bean id="jobTrigger"/></property><!-- every 10 mins in the working day from 9:00 to 19:00 we create/update index --><property name="cronExpression"><value>0 0/10 9-19 *,* * ?</value></property></bean><!-- 定时调用的Scheduler--><bean autowire="no"/></list></property></bean><!-- 事务管理器 --><bean id="transactionManger"/></property></bean><!-- 配置事务拦截器--><bean id="transactionInterceptor"/></property><!-- 下面定义事务传播属性--><property name="transactionAttributes"><props><prop key="find*">PROPAGATION_REQUIRED</prop><prop key="delete*">PROPAGATION_REQUIRED</prop><prop key="add*">PROPAGATION_REQUIRED</prop><prop key="update*">PROPAGATION_REQUIRED</prop><prop key="do*">PROPAGATION_REQUIRED</prop></props></property></bean><!-- 自动代理 --><bean id="autoBeanNameProxyCreator"/></list></property><!-- 这里的配置是必须的,否则无法完成代理的类型转化 这是使用CGLIB来生成代理 --><property name="proxyTargetClass" value="true" /></bean>
Lucene工具类:
package com.dx.bags.util;import java.io.File;import java.io.IOException;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 LuceneUtil{private static LuceneUtil instance;private Analyzer analyzer;private Directory picDirectory;private Directory topDirectory;public Analyzer getAnalyzer(){return analyzer;}public void setAnalyzer(Analyzer analyzer){this.analyzer = analyzer;}public Directory getPicDirectory(){return picDirectory;}public void setPicDirectory(Directory picDirectory){this.picDirectory = picDirectory;}public Directory getTopDirectory(){return topDirectory;}public void setTopDirectory(Directory topDirectory){this.topDirectory = topDirectory;}private LuceneUtil(){analyzer = new IKAnalyzer();try{picDirectory = FSDirectory.open(new File(DXConstants.PIC_INDEX_DIR));topDirectory = FSDirectory.open(new File(DXConstants.TOP_INDEX_DIR));} catch (IOException e){throw new RuntimeException(e);}}public static LuceneUtil getInstance(){if (null == instance)instance = new LuceneUtil();return instance;}}建立索引的方法:
public static void createTopIndex(List<SearchTop> list, boolean isFirstTime){RAMDirectory ramDirectory = new RAMDirectory();try{IndexWriter indexwriter = new IndexWriter(ramDirectory, LuceneUtil.getInstance().getAnalyzer(),true, IndexWriter.MaxFieldLength.LIMITED);if (list != null && list.size() > 0){for (int i = 0; i < list.size(); i++){Document doc = new Document();SearchTop searchTop = list.get(i);Field field = new Field("id", String.valueOf(searchTop.getId()), Field.Store.YES, Field.Index.NO);doc.add(field);String title = DXUtil.characterUtil(searchTop.getTitle());if(title!=null && !"".equals(title)){field = new Field("title", title, Field.Store.YES, Field.Index.ANALYZED);doc.add(field);}String description = searchTop.getDescription();if(description!=null && !"".equals(description)){field = new Field("description", description, Field.Store.NO,Field.Index.ANALYZED);doc.add(field);}field = new Field("cid", String.valueOf(searchTop.getCid()), Field.Store.YES, Field.Index.NOT_ANALYZED);doc.add(field);field = new Field("addtime", String.valueOf(searchTop.getCreateDate()), Field.Store.YES, Field.Index.NOT_ANALYZED);doc.add(field);String content = DXUtil.characterUtil(searchTop.getContents());if(content!=null && !"".equals(content)){field = new Field("contents", content, Field.Store.NO, Field.Index.ANALYZED);doc.add(field);}field = new Field("sex", String.valueOf(searchTop.getSex()), Field.Store.YES, Field.Index.NOT_ANALYZED);doc.add(field);field = new Field("tid",String.valueOf(searchTop.getTid()),Field.Store.YES,Field.Index.NOT_ANALYZED);doc.add(field);field = new Field("topicid", String.valueOf(searchTop.getTopicId()), Field.Store.YES, Field.Index.ANALYZED);doc.add(field);field = new Field("piccount", String.valueOf(searchTop.getPiccount()), Field.Store.YES, Field.Index.NOT_ANALYZED);doc.add(field);String city = DXUtil.characterUtil(searchTop.getCityName());if(city!=null && !"".equals(city)){field = new Field("cityname", city, Field.Store.YES, Field.Index.ANALYZED);doc.add(field);}field = new Field("purview", dealPurview(searchTop.getSex(), searchTop.getCid()), Field.Store.YES, Field.Index.NOT_ANALYZED);doc.add(field);String seasonname = DXUtil.characterUtil(searchTop.getSeasonName());if(seasonname!=null && !"".equals(seasonname)){field = new Field("seasonname", seasonname, Field.Store.YES, Field.Index.ANALYZED);doc.add(field);}String recordurl = dealTopUrl(searchTop.getSex(), searchTop.getCid(), searchTop.getTid());if(recordurl!=null && !"".equals(recordurl)){field = new Field("recordurl", recordurl, Field.Store.YES, Field.Index.NOT_ANALYZED); doc.add(field);}indexwriter.addDocument(doc);}}indexwriter.optimize();indexwriter.close();IndexWriter writer = new IndexWriter(LuceneUtil.getInstance().getTopDirectory(), LuceneUtil.getInstance().getAnalyzer(), isFirstTime, IndexWriter.MaxFieldLength.LIMITED);writer.addIndexesNoOptimize(new Directory[] { ramDirectory });writer.close();} catch (CorruptIndexException e){throw new RuntimeException(e);} catch (IOException ex){throw new RuntimeException(ex);}}对增量数据循环建立索引:
private void createTopIndex() {long count = searchTopService.findTotalRecordNum();boolean flag = DXUtil.hasNotFile(new File(DXConstants.TOP_INDEX_DIR));List<SearchTop> tops = new ArrayList<SearchTop>();int max = DXConstants.PAGE_SIZE;int first = Integer.parseInt(DXUtil.getRecordNumFromFile(DXConstants.TOP_TXT));while (first < count) {tops = searchTopService.findTopToIndex(first, max);first = first + max;IndexCreator.createTopIndex(tops, flag);if(flag == true)flag = false;DXUtil.writeContent(String.valueOf(first), DXConstants.TOP_TXT);}if (first >= count)DXUtil.writeContent(String.valueOf(count), DXConstants.TOP_TXT);optimiseTopicIndex(flag);}//optimize indexprivate void optimiseTopicIndex(boolean flag) {IndexWriter writer = null;try {writer = new IndexWriter(LuceneUtil.getInstance().getTopDirectory(), LuceneUtil.getInstance().getAnalyzer(), flag,IndexWriter.MaxFieldLength.LIMITED);writer.optimize();writer.close();} catch (Exception e) {}}主要代码以备忘。