Changeset 5705
- Timestamp:
- 2010-08-25 14:01:51 (3 years ago)
- Location:
- trunk/daisy/repository/server/src/main/java/org/outerj/daisy
- Files:
-
- 4 edited
-
ftindex/FullTextIndex.java (modified) (1 diff)
-
ftindex/FullTextIndexImpl.java (modified) (11 diffs)
-
query/model/Query.java (modified) (3 diffs)
-
repository/serverimpl/query/LocalQueryManager.java (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/daisy/repository/server/src/main/java/org/outerj/daisy/ftindex/FullTextIndex.java
r5620 r5705 27 27 * This should be guaranteed to happen, i.o.w. use a try-finally block.</b></p> 28 28 */ 29 Hits search(String query, long branchId, long languageId, Date date, boolean searchName, boolean searchContent, boolean searchFields) throws QueryException;29 Hits search(String analyzer, String query, long branchId, long languageId, Date date, boolean searchName, boolean searchContent, boolean searchFields) throws QueryException; 30 30 31 31 /** -
trunk/daisy/repository/server/src/main/java/org/outerj/daisy/ftindex/FullTextIndexImpl.java
r5620 r5705 21 21 import java.util.Arrays; 22 22 import java.util.Date; 23 import java.util.HashMap; 23 24 import java.util.List; 25 import java.util.Map; 24 26 import java.util.concurrent.TimeUnit; 25 27 import java.util.concurrent.locks.Lock; … … 67 69 public class FullTextIndexImpl implements FullTextIndex, FullTextIndexImplMBean, SuspendableProcess { 68 70 private static final int PRECISION_STEP_LONG = 6; 69 private Analyzer luceneAnalyzer; 70 private File indexDirectoryFile; 71 private String indexAnalyzerName; 72 private Analyzer indexAnalyzer; 73 private Analyzer fallbackAnalyzer = new StandardAnalyzer(Version.LUCENE_30); 74 private String defaultQueryAnalyzerName; 75 private Map<String, Analyzer> analyzersByName = new HashMap<String, Analyzer>(); 76 private File indexDirectoryFile; 71 77 private Directory indexDirectory; 72 78 private IndexWriter indexWriter; … … 77 83 private Thread indexFlushThread = null; 78 84 private IndexOptimizeThread indexOptimizeThread = null; 85 private PluginUser<Analyzer> analyzerPluginUser = new AnalyzerPluginUser(); 86 private boolean initDone = false; 79 87 80 88 /** … … 115 123 @PreDestroy 116 124 public void destroy() throws Exception { 125 pluginRegistry.unsetPluginUser(Analyzer.class, analyzerPluginUser); 126 117 127 this.stop(); 118 128 this.dispose(); … … 127 137 throw new ConfigurationException("The specified directory is not a directory: " + directoryName); 128 138 log.debug("Using the following as directory to store indexes: " + indexDirectoryFile); 139 140 indexAnalyzerName = configuration.getChild("indexAnalyzer").getValue(null); 141 defaultQueryAnalyzerName = configuration.getChild("defaultQueryAnalyzer").getValue(null); 129 142 130 143 this.indexFlushInterval = configuration.getChild("indexFlushInterval").getValueAsInteger(indexFlushInterval); … … 146 159 } 147 160 148 // set the analyzer 149 PluginUser<Analyzer> analyzerPluginUser = new AnalyzerPluginUser(); 161 // register the plugin user 150 162 pluginRegistry.setPluginUser(Analyzer.class, analyzerPluginUser); 151 pluginRegistry.unsetPluginUser(Analyzer.class, analyzerPluginUser); 152 if (luceneAnalyzer == null) { 153 luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_30); 154 } 163 164 // fetch the indexAnalyzer; 165 indexAnalyzer = getAnalyzer(indexAnalyzerName); 155 166 156 167 // Make the initial IndexWriter instance … … 163 174 164 175 pluginRegistry.addPlugin(SuspendableProcess.class, SUSPEND_PROCESS_NAME, this); 176 initDone = true; 165 177 } 166 178 … … 232 244 } 233 245 234 public Hits search(String queryAsString, long branchId, long languageId, Date date, boolean searchName, boolean searchContent, boolean searchFields) throws QueryException { 246 public Hits search(String analyzerName, String queryAsString, long branchId, long languageId, Date date, boolean searchName, boolean searchContent, boolean searchFields) throws QueryException { 247 Analyzer analyzer; 248 if (analyzerName == null && defaultQueryAnalyzerName == null) { 249 analyzer = fallbackAnalyzer; 250 } else { 251 if (analyzerName == null) { 252 analyzerName = defaultQueryAnalyzerName; 253 } 254 if (!analyzersByName.containsKey(analyzerName)) { 255 throw new QueryException("No analyzer named " + analyzerName + " is registered"); 256 } 257 analyzer = getAnalyzer(analyzerName); 258 } 235 259 BooleanQuery query = new BooleanQuery(); 236 260 try { … … 244 268 245 269 String[] strings = new String[fieldstoSearch.size()]; 246 Arrays.fill(strings, queryAsString); 247 Query baseQuery = MultiFieldQueryParser.parse(Version.LUCENE_30, strings, fieldstoSearch.toArray(new String[fieldstoSearch.size()]), luceneAnalyzer);270 Arrays.fill(strings, queryAsString);// analyzer = new org.apache.lucene.analysis.fr.FrenchAnalyzer(Version.LUCENE_30); 271 Query baseQuery = MultiFieldQueryParser.parse(Version.LUCENE_30, strings, fieldstoSearch.toArray(new String[fieldstoSearch.size()]), analyzer); 248 272 249 273 query.add(baseQuery, BooleanClause.Occur.MUST); … … 422 446 423 447 private IndexWriter constructIndexWriter() throws IOException { 424 return new IndexWriter(indexDirectory, luceneAnalyzer, MaxFieldLength.UNLIMITED);448 return new IndexWriter(indexDirectory, indexAnalyzer, MaxFieldLength.UNLIMITED); 425 449 } 426 450 … … 530 554 } 531 555 556 public Analyzer getAnalyzer(String name) { 557 Analyzer result = null; 558 if (name != null) { 559 result = analyzersByName.get(name); 560 } 561 if (result == null) { 562 return fallbackAnalyzer; 563 } 564 return result; 565 } 566 532 567 private class AnalyzerPluginUser implements PluginUser<Analyzer> { 533 private boolean done = false;534 535 568 public void pluginAdded(PluginHandle<Analyzer> pluginHandle) { 536 if (!done) { // ignore all but the very first registered plugin 537 done = true; 538 FullTextIndexImpl.this.luceneAnalyzer = pluginHandle.getPlugin(); 539 log.info("Using custom lucene analyzer registered with name " + pluginHandle.getName()); 569 synchronized (analyzersByName) { 570 if (analyzersByName.containsKey(pluginHandle.getName())) { 571 log.warn(String.format("Analyzer with name %s already registered, not registering it again", pluginHandle.getName())); 572 } else { 573 log.info("Registering Lucene Analyzer with name " + pluginHandle.getName()); 574 analyzersByName.put(pluginHandle.getName(), pluginHandle.getPlugin()); 575 if (pluginHandle.getName().equals(indexAnalyzerName) && !FullTextIndexImpl.this.initDone) { 576 log.error("Refusing to set the indexAnalyzer after starting the repository to avoid indexing errors"); 577 } 578 } 540 579 } 541 580 } 542 581 543 582 public void pluginRemoved(PluginHandle<Analyzer> pluginHandle) { 544 // ignored583 analyzersByName.remove(pluginHandle.getName()); 545 584 } 546 585 } -
trunk/daisy/repository/server/src/main/java/org/outerj/daisy/query/model/Query.java
r5624 r5705 60 60 private boolean annotateLinkFields = true; 61 61 private String styleHint; 62 private String analyzerName; 62 63 private SqlGenerationContext sqlGenerationContext; 63 64 private int chunkOffset = 1; … … 222 223 throw new NumberFormatException("The following value could not be used as a chunk length : " + value + ". Chunk lengths must be numeric."); 223 224 } 225 } else if (name.equalsIgnoreCase("ft_query_analyzer")) { 226 this.analyzerName = value; 224 227 } else 225 228 throw new RuntimeException("Unrecognized option: " + name); … … 280 283 this.chunkOffset = chunkOffset; 281 284 } 285 286 public String getAnalyzerName() { 287 return analyzerName; 288 } 282 289 283 290 /** -
trunk/daisy/repository/server/src/main/java/org/outerj/daisy/repository/serverimpl/query/LocalQueryManager.java
r5621 r5705 491 491 pointInTime = query.getVersionMode().getDate(); 492 492 } 493 fullTextHits = fullTextIndex.search( ftQuery.getQuery(), ftQuery.getBranchId(), ftQuery.getLanguageId(), pointInTime,493 fullTextHits = fullTextIndex.search(query.getAnalyzerName(), ftQuery.getQuery(), ftQuery.getBranchId(), ftQuery.getLanguageId(), pointInTime, 494 494 ftQuery.getSearchName(), ftQuery.getSearchContent(), ftQuery.getSearchFields()); 495 495 evaluationInfo.setHits(fullTextHits);
Note: See TracChangeset
for help on using the changeset viewer.