1 41 package com.mvnforum.search.member; 42 43 import java.io.IOException ; 44 45 import net.myvietnam.mvncore.exception.SearchException; 46 import net.myvietnam.mvncore.util.DateUtil; 47 import net.myvietnam.mvncore.util.TimerUtil; 48 49 import org.apache.commons.logging.Log; 50 import org.apache.commons.logging.LogFactory; 51 import org.apache.lucene.analysis.Analyzer; 52 import org.apache.lucene.analysis.standard.StandardAnalyzer; 53 import org.apache.lucene.document.*; 54 import org.apache.lucene.index.*; 55 import org.apache.lucene.search.IndexSearcher; 56 57 import com.mvnforum.*; 58 import com.mvnforum.db.MemberBean; 59 60 public class MemberIndexer 61 { 62 private static Log log = LogFactory.getLog(MemberIndexer.class); 63 64 public static final String FIELD_MEMBER_ID = "MemberID"; 66 public static final String FIELD_MEMBER_NAME = "MemberName"; 67 public static final String FIELD_CREATION_DATE = "MemberCreationDate"; 68 public static final String FIELD_MEMBER_EMAIL = "MemberEmail"; 69 public static final String FIELD_MEMBER_LASTNAME = "MemberLastName"; 70 public static final String FIELD_MEMBER_FIRSTNAME = "MemberFirstName"; 71 public static final String FIELD_MEMBER_COUNTRY = "MemberCountry"; 72 73 76 private static Analyzer analyzer; 78 79 private static long lastOptimizeTime = 0; 80 81 static { 82 initializeAnalyzer(); 83 } 84 85 public static void scheduleAddMemberTask(MemberBean MemberBean) { 86 AddUpdateMemberIndexTask task = new AddUpdateMemberIndexTask(MemberBean, AddUpdateMemberIndexTask.OPERATION_ADD); 87 TimerUtil.getInstance().schedule(task, 0); 88 } 89 90 public static void scheduleUpdateMemberTask(MemberBean MemberBean) { 91 AddUpdateMemberIndexTask task = new AddUpdateMemberIndexTask(MemberBean, AddUpdateMemberIndexTask.OPERATION_UPDATE); 92 TimerUtil.getInstance().schedule(task, 0); 93 } 94 95 public static void scheduleDeleteMemberTask(int objectID) { 96 DeleteMemberIndexTask task = new DeleteMemberIndexTask(objectID); 97 TimerUtil.getInstance().schedule(task, 0); 98 } 99 100 public static void scheduleRebuildIndexTask() { 101 int maxMemberID = 0; 102 RebuildMemberIndexTask task = new RebuildMemberIndexTask(maxMemberID); 103 TimerUtil.getInstance().schedule(task, 0); 104 } 105 106 static Analyzer getAnalyzer() { 107 return analyzer; 108 } 109 110 114 private static void initializeAnalyzer() { 115 String analyzerClassName = MVNForumFactoryConfig.getLuceneAnalyzerClassName(); 116 if ( (analyzerClassName == null) || (analyzerClassName.equals("")) ) { 117 analyzer = new StandardAnalyzer(); 120 log.debug("Using StandardAnalyzer for indexing"); 121 } else { 122 try { 124 log.debug("About to load Analyzer [" + analyzerClassName + "] for indexing"); 125 analyzer = (Analyzer) Class.forName(analyzerClassName).newInstance(); 126 } catch (Exception e) { 127 log.warn("Cannot load " + analyzerClassName + ". Loading StandardAnalyzer"); 128 analyzer = new StandardAnalyzer(); 129 } 130 } 131 } 132 133 141 static IndexWriter getIndexWriter(boolean create) throws SearchException { 142 IndexWriter writer = null; 143 144 if (create == false) { 146 try { 147 writer = new IndexWriter(MVNForumConfig.getSearchMemberIndexDir(), analyzer, false); 148 if (MVNForumConfig.getSearchMemberIndexType() == MVNForumGlobal.SEARCH_INDEX_TYPE_DISK) { 149 writer.setUseCompoundFile(true); 150 } 151 return writer; 152 } catch (IOException e) { 153 log.warn("Cannot open existed index. New index will be created.", e); 154 } 156 } 157 try { 160 writer = new IndexWriter(MVNForumConfig.getSearchMemberIndexDir(true), analyzer, true); 162 if (MVNForumConfig.getSearchMemberIndexType() == MVNForumGlobal.SEARCH_INDEX_TYPE_DISK) { 163 writer.setUseCompoundFile(true); 164 } 165 return writer; 166 } catch (IOException e) { 167 throw new SearchException("Error while creating index writer"); 168 } 169 } 170 171 178 static void doIndexMember(MemberBean memberBean, IndexWriter writer) throws SearchException { 179 if (memberBean == null) return; 180 if ( memberBean.getMemberName() == null || memberBean.getMemberName().equals("") || 181 (memberBean.getMemberCreationDate() == null)) { 182 return; 183 } 184 185 Document memberDocument = new Document(); 187 memberDocument.add(Field.Keyword(FIELD_MEMBER_ID, Integer.toString(memberBean.getMemberID()))); 189 memberDocument.add(Field.UnStored(FIELD_MEMBER_NAME, memberBean.getMemberName())); 190 memberDocument.add(Field.UnStored(FIELD_MEMBER_EMAIL, memberBean.getMemberEmail())); 191 memberDocument.add(Field.UnStored(FIELD_MEMBER_LASTNAME, memberBean.getMemberLastname())); 192 memberDocument.add(Field.UnStored(FIELD_MEMBER_FIRSTNAME, memberBean.getMemberFirstname())); 193 memberDocument.add(Field.UnStored(FIELD_MEMBER_COUNTRY, memberBean.getMemberCountry())); 194 memberDocument.add(Field.Keyword(FIELD_CREATION_DATE, DateField.dateToString(memberBean.getMemberCreationDate()))); try { 197 writer.addDocument(memberDocument); 198 } catch (IOException e) { 199 log.error("MemberIndexer.doIndexMember failed", e); 200 throw new SearchException("Error writing new Member to index"); 201 } 202 } 203 204 209 static void addMemberToIndex(MemberBean memberBean) throws SearchException, IOException { 210 IndexWriter writer = null; 211 try { 212 writer = getIndexWriter(false); 213 if (writer == null) { 214 log.warn("Cannot get the IndexWriter"); 215 return; 216 } 217 doIndexMember(memberBean, writer); 218 219 long now = System.currentTimeMillis(); 221 long timeFromLastOptimize = now - lastOptimizeTime; 222 if (timeFromLastOptimize > DateUtil.HOUR) { 223 log.debug("writer.optimize() called in addMemberToIndex"); 224 writer.optimize(); 225 lastOptimizeTime = now; 226 } 227 } catch (SearchException ex) { 228 throw ex; 229 } finally { 230 try { 231 if (writer != null) { 232 writer.close(); 233 } 234 } catch (IOException e) { 235 } 236 } 237 } 238 239 244 static void deleteMemberFromIndex(int memberID) throws SearchException { 245 IndexReader reader = null; 246 try { 247 reader = IndexReader.open(MVNForumConfig.getSearchMemberIndexDir()); 248 if (reader == null) { 249 log.warn("Cannot get the IndexReader"); 250 return; 251 } 252 253 Term term = new Term(FIELD_MEMBER_ID, String.valueOf(memberID)); 254 int deletedCount = reader.delete(term); 255 log.debug("deleteMemberFromIndex: deleted member = " + deletedCount); 256 } catch (IOException e) { 257 throw new SearchException("Error trying to delete Member with memberID = " + memberID); 258 } finally { 259 try { 260 if (reader != null) { 261 reader.close(); 262 } 263 } catch (IOException e) { 264 } 265 } 266 } 267 268 public static IndexSearcher getSearcher() throws IOException { 269 try { 270 IndexSearcher searcher = new IndexSearcher(MVNForumConfig.getSearchMemberIndexDir()); 271 return searcher; 272 } catch (IOException ex) { 273 log.error("Cannot access the lucene search index for query. Please check if you have configed mvnForumHome properly. You can also go to Admin Zone to rebuild the Lucene index files.", ex); 276 throw new IOException ("Cannot access the lucene search index. Please report this error to web site Administrator (check mvnForumHome or rebuild Lucene index)."); 278 } 279 } 280 281 public static int getNumDocs() { 282 int numDocs = -1; 283 IndexReader reader = null; 284 try { 285 reader = IndexReader.open(MVNForumConfig.getSearchMemberIndexDir()); 286 if (reader == null) { 287 log.warn("Cannot get the IndexReader"); 288 return -1; 289 } 290 numDocs = reader.numDocs(); 291 } catch ( IOException ioe) { 292 } finally { 294 try { 295 if (reader != null) reader.close(); 296 } catch (IOException e) { 297 log.debug("Error closing Lucene IndexReader", e); 298 } 299 } 300 return numDocs; 301 } 302 303 } 304
| Popular Tags
|