r964 - in trunk/wikitty-lucene/src: main/java/org/nuiton/wikitty/storage/lucene test/java/org/nuiton/wikitty/storage/lucene
Author: echatellier Date: 2011-06-23 16:59:03 +0200 (Thu, 23 Jun 2011) New Revision: 964 Url: http://nuiton.org/repositories/revision/wikitty/964 Log: Gestion du champ suppl?\195?\169mentaire "fulltext" (pour faire les recherches keyword). Gestion du cas de recherche sans resultat demande (juste le nombre ou factettes). Modified: trunk/wikitty-lucene/src/main/java/org/nuiton/wikitty/storage/lucene/Restriction2Lucene.java trunk/wikitty-lucene/src/main/java/org/nuiton/wikitty/storage/lucene/WikittyLuceneConstants.java trunk/wikitty-lucene/src/main/java/org/nuiton/wikitty/storage/lucene/WikittySearchEngineLucene.java trunk/wikitty-lucene/src/test/java/org/nuiton/wikitty/storage/lucene/WikittySearchEngineLuceneTest.java Modified: trunk/wikitty-lucene/src/main/java/org/nuiton/wikitty/storage/lucene/Restriction2Lucene.java =================================================================== --- trunk/wikitty-lucene/src/main/java/org/nuiton/wikitty/storage/lucene/Restriction2Lucene.java 2011-06-23 14:11:47 UTC (rev 963) +++ trunk/wikitty-lucene/src/main/java/org/nuiton/wikitty/storage/lucene/Restriction2Lucene.java 2011-06-23 14:59:03 UTC (rev 964) @@ -73,10 +73,31 @@ public Restriction2Lucene(Analyzer analyzer) { parser = new QueryParser(WikittySearchEngineLucene.WIKITTY_LUCENE_VERSION, - WikittyLuceneConstants.WIKITTY_LUCENE_DEFAULT_FIELD, analyzer); + WikittyLuceneConstants.LUCENE_DEFAULT_FIELD, analyzer); + + // allow "*" or "?" if first character wildcard query + parser.setAllowLeadingWildcard(true); } /** + * Get field name used in lucene storage for a field name in query. + * + * @param fieldName field name to convert + * @return field name in lucene + */ + protected String getLuceneFieldName(String fieldName) { + String result; + if (Element.ELT_ID.equals(fieldName)) { + result = WikittyLuceneConstants.LUCENE_ID; + } else if (Element.ELT_EXTENSION.equals(fieldName)) { + result = WikittyLuceneConstants.LUCENE_EXTENSIONS; + } else { + result = fieldName; + } + return result; + } + + /** * Convert a wikitty restriction to lucene search query. * * @param restriction restriction to convert @@ -168,6 +189,7 @@ protected String element2Lucene(Element element) { String result = element.getName(); //result = fieldModifer.convertToSolr(transaction, result); + result = getLuceneFieldName(result); return result; } Modified: trunk/wikitty-lucene/src/main/java/org/nuiton/wikitty/storage/lucene/WikittyLuceneConstants.java =================================================================== --- trunk/wikitty-lucene/src/main/java/org/nuiton/wikitty/storage/lucene/WikittyLuceneConstants.java 2011-06-23 14:11:47 UTC (rev 963) +++ trunk/wikitty-lucene/src/main/java/org/nuiton/wikitty/storage/lucene/WikittyLuceneConstants.java 2011-06-23 14:59:03 UTC (rev 964) @@ -37,11 +37,6 @@ public class WikittyLuceneConstants { /** - * Query search default field. - */ - static final public String WIKITTY_LUCENE_DEFAULT_FIELD = "text"; - - /** * Prefix utiliser pour les champs ajouter lors de l'indexation. Ce prefix * evite d'avoir des conflits entre un nom d'extension et un champs ajoute. */ @@ -49,4 +44,10 @@ /** Id field in lucene. */ static final public String LUCENE_ID = WIKITTY_LUCENE_PREFIX + "id"; + + /** extensions field name in lucene */ + static final public String LUCENE_EXTENSIONS = WIKITTY_LUCENE_PREFIX + "extensions"; + + /** extensions field name in lucene */ + static final public String LUCENE_DEFAULT_FIELD = WIKITTY_LUCENE_PREFIX + "fulltext"; } Modified: trunk/wikitty-lucene/src/main/java/org/nuiton/wikitty/storage/lucene/WikittySearchEngineLucene.java =================================================================== --- trunk/wikitty-lucene/src/main/java/org/nuiton/wikitty/storage/lucene/WikittySearchEngineLucene.java 2011-06-23 14:11:47 UTC (rev 963) +++ trunk/wikitty-lucene/src/main/java/org/nuiton/wikitty/storage/lucene/WikittySearchEngineLucene.java 2011-06-23 14:59:03 UTC (rev 964) @@ -51,6 +51,7 @@ import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; import org.apache.lucene.search.TopDocs; +import org.apache.lucene.search.TotalHitCountCollector; import org.apache.lucene.store.Directory; import org.apache.lucene.store.NIOFSDirectory; import org.apache.lucene.util.Version; @@ -144,7 +145,6 @@ String luceneAnalyzerFactoryKey = WikittyConfigOption.WIKITTY_SEARCHENGINE_LUCENE_INDEX_ANALYZER.getKey(); try { - Class analyzerClass = config.getOptionAsClass(luceneAnalyzerFactoryKey); if (analyzerClass != null) { @@ -156,7 +156,6 @@ if (log.isErrorEnabled()) { log.error("Can't init lucene analyzer : " + config.getOption(luceneAnalyzerFactoryKey), ex); } - } // default to StandardAnalyzer @@ -247,7 +246,14 @@ Field luceneIdField = new Field(WikittyLuceneConstants.LUCENE_ID, w.getId(), Store.YES, Index.ANALYZED); document.add(luceneIdField); + + // wikitty extension + String extAsString = StringUtils.join(w.getExtensionNames(), ","); + Field luceneExtField = new Field(WikittyLuceneConstants.LUCENE_EXTENSIONS, + extAsString, Store.YES, Index.ANALYZED); + document.add(luceneExtField); + StringBuffer allAsText = new StringBuffer(); // all other wikitty fields for (String wikyttyField : w.getAllFieldNames()) { String ext = WikittyUtil.getExtensionNameFromFQFieldName(wikyttyField); @@ -263,9 +269,16 @@ // Index.ANALYZED = mandatory for search on field Field luceneField = new Field(wikyttyField, value, Store.YES, Index.ANALYZED); document.add(luceneField); + + allAsText.append(value); } } - + + // le champ text n'est pas stocké + Field luceneFullTextField = new Field(WikittyLuceneConstants.LUCENE_DEFAULT_FIELD, + allAsText.toString(), Store.NO, Index.ANALYZED); + document.add(luceneFullTextField); + return document; } @@ -275,7 +288,7 @@ @Override public void delete(WikittyTransaction transaction, Collection<String> idList) throws WikittyException { - + // TODO manage transaction IndexWriter writer = null; @@ -322,6 +335,10 @@ Restriction2Lucene restriction2Lucene = new Restriction2Lucene(indexAnalyzer); Query query = restriction2Lucene.toLucene(restriction); + if (log.isDebugEnabled()) { + log.debug("Performing search query : " + query.toString()); + } + // configure sorting List<SortField> sortFields = new ArrayList<SortField>(); List<String> sortAscending = criteria.getSortAscending(); @@ -350,29 +367,45 @@ endIndex = searcher.maxDoc(); } - // get results - TopDocs topDocs = null; - if (sortFields.isEmpty()) { - topDocs = searcher.search(query, null, endIndex); + // execute search query + List<String> results = new ArrayList<String>(); + int totalHitCount = 0; + if (endIndex == 0) { + // il faut un cas special pour le 0, sinon lucene rale. + // Utilisation d'un collector qui ne fait que compter + // le nombre de résultat + TotalHitCountCollector collector = new TotalHitCountCollector(); + searcher.search(query, null, collector); + totalHitCount = collector.getTotalHits(); } else { - Sort sortOption = new Sort(sortFields.toArray(new SortField[sortFields.size()])); - topDocs = searcher.search(query, null, endIndex, sortOption); - } - ScoreDoc[] scoreDocs = topDocs.scoreDocs; - int currentDocIndex = 0; - List<String> results = new ArrayList<String>(); - for (ScoreDoc scoreDoc : scoreDocs) { - if (currentDocIndex >= firstIndex && currentDocIndex <= endIndex) { - int luceneId = scoreDoc.doc; - Document document = searcher.doc(luceneId); - String wikittyId = document.get(WikittyLuceneConstants.LUCENE_ID); - results.add(wikittyId); + // ca où il y a vraiment des documents retourné par la requete + TopDocs topDocs = null; + if (sortFields.isEmpty()) { + topDocs = searcher.search(query, null, endIndex); + } else { + Sort sortOption = new Sort(sortFields.toArray(new SortField[sortFields.size()])); + topDocs = searcher.search(query, null, endIndex, sortOption); } + ScoreDoc[] scoreDocs = topDocs.scoreDocs; + + int currentDocIndex = 0; + + for (ScoreDoc scoreDoc : scoreDocs) { + if (currentDocIndex >= firstIndex && currentDocIndex <= endIndex) { + int luceneId = scoreDoc.doc; + Document document = searcher.doc(luceneId); + String wikittyId = document.get(WikittyLuceneConstants.LUCENE_ID); + results.add(wikittyId); + } + } + + totalHitCount = topDocs.totalHits; } - pagedResult = new PagedResult<String>(firstIndex, topDocs.totalHits, query.toString(), null, results); - + pagedResult = new PagedResult<String>(firstIndex, totalHitCount, + query.toString(), null, results); + } catch (IOException ex) { throw new WikittyException("Can't search on index", ex); } finally { Modified: trunk/wikitty-lucene/src/test/java/org/nuiton/wikitty/storage/lucene/WikittySearchEngineLuceneTest.java =================================================================== --- trunk/wikitty-lucene/src/test/java/org/nuiton/wikitty/storage/lucene/WikittySearchEngineLuceneTest.java 2011-06-23 14:11:47 UTC (rev 963) +++ trunk/wikitty-lucene/src/test/java/org/nuiton/wikitty/storage/lucene/WikittySearchEngineLuceneTest.java 2011-06-23 14:59:03 UTC (rev 964) @@ -110,20 +110,21 @@ ws.store(null, toStore, false); - { - Criteria c = Search.query().keyword("lab*").criteria(); - PagedResult<String> result = ws.findAllByCriteria( - null, Collections.singletonList(c)).get(0); - System.out.println(result.getAll()); - Assert.assertEquals(2, result.getNumFound()); + Criteria c = Search.query().keyword("lab*").criteria(); + PagedResult<String> result = ws.findAllByCriteria( + null, Collections.singletonList(c)).get(0); + if (log.isInfoEnabled()) { + log.info("Results = " + result.getAll()); } - { - Criteria c = Search.query().keyword("*a*").criteria(); - PagedResult<String> result = ws.findAllByCriteria( - null, Collections.singletonList(c)).get(0); - System.out.println(result.getAll()); - Assert.assertEquals(3, result.getNumFound()); + Assert.assertEquals(2, result.getNumFound()); + + Criteria c2 = Search.query().keyword("*a*").criteria(); + PagedResult<String> result2 = ws.findAllByCriteria( + null, Collections.singletonList(c2)).get(0); + if (log.isInfoEnabled()) { + log.info("Results = " + result2.getAll()); } + Assert.assertEquals(3, result2.getNumFound()); }
participants (1)
-
echatellier@users.nuiton.org