Author: echatellier Date: 2010-03-11 16:53:22 +0100 (Thu, 11 Mar 2010) New Revision: 1837 Log: Update to lucene 3 (not very usefull, but fix some deprecated warning) Modified: trunk/pom.xml trunk/topia-service-index/src/main/java/org/nuiton/topia/index/LuceneIndexer.java Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2010-03-11 15:49:44 UTC (rev 1836) +++ trunk/pom.xml 2010-03-11 15:53:22 UTC (rev 1837) @@ -158,11 +158,10 @@ <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> - <version>2.4.1</version> + <version>3.0.1</version> <scope>compile</scope> </dependency> - </dependencies> </dependencyManagement> Modified: trunk/topia-service-index/src/main/java/org/nuiton/topia/index/LuceneIndexer.java =================================================================== --- trunk/topia-service-index/src/main/java/org/nuiton/topia/index/LuceneIndexer.java 2010-03-11 15:49:44 UTC (rev 1836) +++ trunk/topia-service-index/src/main/java/org/nuiton/topia/index/LuceneIndexer.java 2010-03-11 15:53:22 UTC (rev 1837) @@ -45,20 +45,26 @@ import org.apache.lucene.analysis.SimpleAnalyzer; 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.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; -import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; +import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.Searcher; +import org.apache.lucene.search.TopDocs; +import org.apache.lucene.store.Directory; +import org.apache.lucene.store.NIOFSDirectory; +import org.apache.lucene.util.Version; +import org.hibernate.HibernateException; +import org.hibernate.metadata.ClassMetadata; import org.nuiton.topia.TopiaNotFoundException; import org.nuiton.topia.framework.TopiaContextImplementor; import org.nuiton.topia.persistence.TopiaId; -import org.hibernate.HibernateException; -import org.hibernate.metadata.ClassMetadata; /** * To use this indexer you must have two properties defined in config file: @@ -81,21 +87,19 @@ */ public class LuceneIndexer implements TopiaIndexImplementor { - private static final String TOPIA_ID = "topiaId"; /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(LuceneIndexer.class); + + private static final String TOPIA_ID = "topiaId"; + protected File directory = null; + protected TopiaContextImplementor context; + /** contient les objets a reindexer car creer, modifier ou supprimer. key: id, value: fields values or null for deletion */ protected Map<Object, Object[]> indexationMap = new HashMap<Object, Object[]>(); - /** - * - */ - public LuceneIndexer() { - } - - /* (non-Javadoc) + /* * @see org.nuiton.topia.framework.TopiaService#getServiceName() */ @Override @@ -103,7 +107,7 @@ return TopiaIndexService.SERVICE_NAME; } - /* (non-Javadoc) + /* * @see org.nuiton.topia.framework.TopiaService#getPersistenceClasses() */ @Override @@ -120,7 +124,7 @@ } } - /* (non-Javadoc) + /* * @see org.nuiton.topia.framework.TopiaService#init(org.nuiton.topia.framework.TopiaContextImplementor) */ @Override @@ -135,7 +139,7 @@ String dirname = prop.getProperty("topia.index.lucene.directory"); directory = new File(dirname); directory.mkdirs(); - + return true; } @@ -146,13 +150,18 @@ @Override public void doIndexation() { + try { + Directory indexDirectory = new NIOFSDirectory(directory); + // TODO maybe put in configuration to allow localized analysers + Analyzer analyzer = new SimpleAnalyzer(); + boolean create = false; - if (!IndexReader.indexExists(directory)) { + if (!IndexReader.indexExists(indexDirectory)) { // si l'index n'existe pas, on force la creation create = true; } else { - IndexReader reader = IndexReader.open(directory); + IndexReader reader = IndexReader.open(indexDirectory); for (Map.Entry<Object, Object[]> e : indexationMap.entrySet()) { String id = e.getKey().toString(); @@ -161,7 +170,7 @@ reader.close(); } - IndexWriter writer = new IndexWriter(directory, new SimpleAnalyzer(), create); + IndexWriter writer = new IndexWriter(indexDirectory, analyzer, create, IndexWriter.MaxFieldLength.LIMITED); for (Map.Entry<Object, Object[]> e : indexationMap.entrySet()) { String id = e.getKey().toString(); Object[] fields = e.getValue(); @@ -209,8 +218,9 @@ String[] names = cm.getPropertyNames(); org.apache.lucene.document.Document doc = new org.apache.lucene.document.Document(); - doc.add(new Field("class", classname, Field.Store.YES, Field.Index.TOKENIZED)); - doc.add(new Field("topiaId", id, Field.Store.YES, Field.Index.TOKENIZED)); + + doc.add(new Field("class", classname, Store.YES, Index.ANALYZED)); + doc.add(new Field("topiaId", id, Store.YES, Index.ANALYZED)); StringBuffer all = new StringBuffer(); for (int i = 0; i < fields.length; i++) { String name = names[i]; @@ -220,13 +230,13 @@ // do nothing } else { String val = String.valueOf(o); - doc.add(new Field(name, val, Field.Store.YES, Field.Index.TOKENIZED)); + doc.add(new Field(name, val, Store.YES, Index.ANALYZED)); all.append(val); all.append(" "); } } if (all.length() > 0) { - doc.add(new Field("__all__", all.toString(), Field.Store.NO, Field.Index.TOKENIZED)); + doc.add(new Field("__all__", all.toString(), Field.Store.NO, Index.ANALYZED)); } writer.addDocument(doc); } @@ -241,48 +251,57 @@ } public SortedSet<IndexEntry> search(String queryText) { - Hits hits = null; - if (IndexReader.indexExists(directory)) { - try { - Searcher searcher = new IndexSearcher(directory.getAbsolutePath()); - Analyzer analyzer = new SimpleAnalyzer(); + TopDocs topDocs = null; + Searcher searcher = null; + try { + + Directory indexDirectory = new NIOFSDirectory(directory); + // TODO maybe put in configuration to allow localized analysers + Analyzer analyzer = new SimpleAnalyzer(); + + if (IndexReader.indexExists(indexDirectory)) { + searcher = new IndexSearcher(indexDirectory); + if (queryText.equals("") || queryText.length() == 0) { // la chaine passée en parametre est vide ! log.debug("requete vide, pas de resultat a renvoyer."); } else { - QueryParser parser = new QueryParser("__all__", analyzer); + QueryParser parser = new QueryParser(Version.LUCENE_30, "__all__", analyzer); Query luceneQuery = parser.parse(queryText); if (log.isDebugEnabled()) { log.debug("Recherche du terme : " + luceneQuery.toString()); } - hits = searcher.search(luceneQuery); + + // TODO improve doc collectors using + topDocs = searcher.search(luceneQuery, null /*filter*/, 100); searcher.close(); } - } catch (IOException ioe) { + } else { + // l'index n'a pas encore ete créé ! if (log.isDebugEnabled()) { - log.debug(ioe.getMessage(), ioe); + log.debug("Index inexistant, pas de resultats à renvoyer !"); } - } catch (ParseException pe) { - if (log.isDebugEnabled()) { - log.debug(pe.getMessage(), pe); - } } - } else { - // l'index n'a pas encore ete créé ! + } catch (IOException ioe) { if (log.isDebugEnabled()) { - log.debug("Index inexistant, pas de resultats à renvoyer !"); + log.debug(ioe.getMessage(), ioe); } + } catch (ParseException pe) { + if (log.isDebugEnabled()) { + log.debug(pe.getMessage(), pe); + } } + //retourne les resultats trouves TreeSet<IndexEntry> result = new TreeSet<IndexEntry>(); - if (hits != null) { - for (int i = 0; i < hits.length(); i++) { + if (searcher != null && topDocs != null) { + ScoreDoc[] scoreDocs = topDocs.scoreDocs; + for (ScoreDoc scoreDoc : scoreDocs) { try { - float score = hits.score(i); - Document doc = hits.doc(i); + Document doc = searcher.doc(scoreDoc.doc); String topiaId = doc.get(TOPIA_ID); - IndexEntry ie = new IndexEntry(score, topiaId); + IndexEntry ie = new IndexEntry(scoreDoc.score, topiaId); result.add(ie); } catch (IOException eee) { if (log.isWarnEnabled()) { @@ -331,5 +350,3 @@ return result; } } - -