Java tutorial
/** * Crown Copyright (C) 2008 - 2011 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * */ package uk.nhs.cfh.dsp.yasb.indexgenerator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.lucene.analysis.standard.StandardAnalyzer; 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.index.CorruptIndexException; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.jdesktop.swingworker.SwingWorker; import uk.nhs.cfh.dsp.snomed.dao.TerminologyConceptDAO; import uk.nhs.cfh.dsp.snomed.objectmodel.SnomedConcept; import uk.nhs.cfh.dsp.snomed.objectmodel.error.ConceptNotFoundException; import javax.sql.DataSource; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Collection; // TODO: Auto-generated Javadoc /** * This class generates a {@link Directory} index for Snomed concepts * Written by @author jay * Created on Dec 22, 2008 at 5:05:57 PM. */ public class SnomedLuceneIndexer extends SwingWorker<Void, Void> { /** The directory. */ private Directory directory; /** The logger. */ private static Log logger = LogFactory.getLog(SnomedLuceneIndexer.class); /** The connection. */ private Connection connection; /** The index writer. */ private IndexWriter indexWriter; /** The terminology concept dao. */ private TerminologyConceptDAO terminologyConceptDAO; /** * Instantiates a new snomed lucene indexer. * * @param dataSource the data source * @param terminologyConceptDAO the terminology concept dao */ public SnomedLuceneIndexer(DataSource dataSource, TerminologyConceptDAO terminologyConceptDAO) { try { this.connection = dataSource.getConnection(); this.terminologyConceptDAO = terminologyConceptDAO; // create directory; try { directory = FSDirectory.getDirectory(System.getProperty("user.dir") + "/index/snomed-desc/lucene"); logger.debug("Value of directory : " + directory); indexWriter = new IndexWriter(directory, new StandardAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED); } catch (IOException e) { logger.warn("Error locating location of index directory.\n" + "Nested exception is : " + e.fillInStackTrace()); } } catch (SQLException e) { logger.warn("Error obtaining connection from data source.\n" + "Nested exception is : " + e.fillInStackTrace()); } } /** * Index concepts. */ private void indexConcepts() { try { Statement statement = connection.createStatement(); ResultSet rs = statement.executeQuery("" + "SELECT DISTINCT CONCEPTID FROM SNOMED.CONCEPT"); int counter = 1; while (rs.next()) { String conceptID = rs.getString("CONCEPTID"); SnomedConcept concept = (SnomedConcept) terminologyConceptDAO.getTerminologyConcept(conceptID); // get attributes of concept and add to lucene document Document document = new Document(); String preferredTerm = concept.getPreferredLabel(); String fullySpecName = concept.getFullySpecifiedName(); String isPrimitive = String.valueOf(concept.isPrimitive()); String source = concept.getSource(); String status = concept.getStatus().name(); String conceptType = concept.getType().name(); // replace all spaces in concept type with underscores conceptType = conceptType.replaceAll(" ", "_"); document.add(new Field("ID", conceptID, Store.COMPRESS, Index.ANALYZED)); document.add(new Field("FSN", fullySpecName, Store.COMPRESS, Index.ANALYZED)); document.add(new Field("TERM", fullySpecName, Store.NO, Index.ANALYZED)); document.add(new Field("PT", preferredTerm, Store.NO, Index.ANALYZED)); document.add(new Field("TERM", preferredTerm, Store.NO, Index.ANALYZED)); document.add(new Field("SOURCE", source, Store.NO, Index.ANALYZED)); document.add(new Field("STATUS", status, Store.COMPRESS, Index.ANALYZED)); document.add(new Field("ISPRIMTIVE", isPrimitive, Store.NO, Index.NOT_ANALYZED)); document.add(new Field("TYPE", conceptType, Store.NO, Index.ANALYZED)); Collection<String> synonyms = concept.getSynonyms(); for (String synonym : synonyms) { document.add(new Field("SYN", synonym, Store.NO, Index.ANALYZED)); // add synonym as a general term to be indexed document.add(new Field("TERM", synonym, Store.NO, Index.ANALYZED)); } // add document to index indexWriter.addDocument(document); // debuggin messages if (logger.isDebugEnabled() && counter % 1000 == 0) { logger.debug("Concepts indexed : " + counter); } // increment counter counter++; } // close result set and statement rs.close(); statement.close(); // optimise index indexWriter.optimize(); indexWriter.commit(); } catch (SQLException e) { logger.warn(e.fillInStackTrace()); } catch (ConceptNotFoundException e) { logger.warn(e.fillInStackTrace()); } catch (CorruptIndexException e) { logger.warn(e.fillInStackTrace()); } catch (IOException e) { logger.warn(e.fillInStackTrace()); } } /* (non-Javadoc) * @see org.jdesktop.swingworker.SwingWorker#doInBackground() */ @Override protected Void doInBackground() throws Exception { // index concepts logger.info("Started indexing concepts"); indexConcepts(); return null; } /* (non-Javadoc) * @see org.jdesktop.swingworker.SwingWorker#done() */ @Override protected void done() { // close index writer try { indexWriter.close(); } catch (CorruptIndexException e) { logger.warn(e.fillInStackTrace()); } catch (IOException e) { logger.warn(e.fillInStackTrace()); } logger.info("Finished creating index"); } /** * Gets the directory. * * @return the directory */ public Directory getDirectory() { return directory; } }