Revision 9550f4b4
Added by Andreas Kohlbecker over 8 years ago
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/search/LuceneSearch.java | ||
---|---|---|
19 | 19 |
import org.apache.lucene.search.BooleanClause.Occur; |
20 | 20 |
import org.apache.lucene.search.BooleanQuery; |
21 | 21 |
import org.apache.lucene.search.BooleanQuery.Builder; |
22 |
import org.apache.lucene.search.Filter; |
|
23 | 22 |
import org.apache.lucene.search.IndexSearcher; |
24 | 23 |
import org.apache.lucene.search.MultiCollector; |
25 | 24 |
import org.apache.lucene.search.Query; |
... | ... | |
64 | 63 |
|
65 | 64 |
private Class<? extends CdmBase> directorySelectClass; |
66 | 65 |
|
67 |
private Filter filter = null;
|
|
66 |
private BooleanQuery filter = null;
|
|
68 | 67 |
|
69 | 68 |
protected Class<? extends CdmBase> getDirectorySelectClass() { |
70 | 69 |
return pushAbstractBaseTypeDown(directorySelectClass); |
... | ... | |
83 | 82 |
/** |
84 | 83 |
* @return the filter |
85 | 84 |
*/ |
86 |
public Filter getFilter() {
|
|
85 |
public BooleanQuery getFilter() {
|
|
87 | 86 |
return filter; |
88 | 87 |
} |
89 | 88 |
|
90 | 89 |
/** |
91 | 90 |
* @param filter the filter to set |
92 | 91 |
*/ |
93 |
public void setFilter(Filter filter) {
|
|
92 |
public void setFilter(BooleanQuery filter) {
|
|
94 | 93 |
this.filter = filter; |
95 | 94 |
} |
96 | 95 |
|
... | ... | |
234 | 233 |
* @throws IOException |
235 | 234 |
*/ |
236 | 235 |
public TopDocs executeSearch(int maxNoOfHits) throws IOException { |
237 |
Query fullQuery = expandQuery(); |
|
236 |
BooleanQuery fullQuery = expandQuery();
|
|
238 | 237 |
logger.info("lucene query string to be parsed: " + fullQuery.toString()); |
239 |
return getSearcher().search(fullQuery, filter, maxNoOfHits);
|
|
238 |
return getSearcher().search(fullQuery, maxNoOfHits); |
|
240 | 239 |
|
241 | 240 |
} |
242 | 241 |
/** |
... | ... | |
257 | 256 |
logger.info("limiting pageSize to MAX_HITS_ALLOWED = " + MAX_HITS_ALLOWED + " items"); |
258 | 257 |
} |
259 | 258 |
|
260 |
Query fullQuery = expandQuery(); |
|
259 |
BooleanQuery fullQuery = expandQuery();
|
|
261 | 260 |
logger.info("final query: " + fullQuery.toString()); |
262 | 261 |
|
263 | 262 |
int offset = pageNumber * pageSize; |
... | ... | |
282 | 281 |
TermFirstPassGroupingCollector firstPassCollector = new TermFirstPassGroupingCollector( |
283 | 282 |
groupByField, groupSort, limit); |
284 | 283 |
|
285 |
getSearcher().search(fullQuery, filter , firstPassCollector);
|
|
284 |
getSearcher().search(fullQuery, firstPassCollector); |
|
286 | 285 |
Collection<SearchGroup<BytesRef>> topGroups = firstPassCollector.getTopGroups(0, true); // no offset here since we need the first item for the max score |
287 | 286 |
|
288 | 287 |
if (topGroups == null) { |
... | ... | |
302 | 301 |
groupByField, topGroups, groupSort, withinGroupSort, maxDocsPerGroup , getScores, |
303 | 302 |
getMaxScores, fillFields |
304 | 303 |
); |
305 |
getSearcher().search(fullQuery, filter, MultiCollector.wrap(secondPassCollector, allGroupsCollector));
|
|
304 |
getSearcher().search(fullQuery, MultiCollector.wrap(secondPassCollector, allGroupsCollector)); |
|
306 | 305 |
|
307 | 306 |
TopGroups<BytesRef> groupsResult = secondPassCollector.getTopGroups(0); // no offset here since we need the first item for the max score |
308 | 307 |
|
... | ... | |
322 | 321 |
/** |
323 | 322 |
* expands the query by adding a type restriction if the |
324 | 323 |
* <code>cdmTypeRestriction</code> is not <code>NULL</code> |
324 |
* and adds the <code>filter</code> as Boolean query |
|
325 |
* clause with {@link Occur#FILTER} |
|
325 | 326 |
*/ |
326 |
protected Query expandQuery() { |
|
327 |
BooleanQuery fullQuery; |
|
327 |
protected BooleanQuery expandQuery() { |
|
328 |
BooleanQuery fullQuery = null; |
|
329 |
Builder fullQueryBuilder = null; |
|
330 |
|
|
328 | 331 |
if(cdmTypeRestriction != null){ |
329 |
fullQuery = QueryFactory.addTypeRestriction(query, cdmTypeRestriction); |
|
332 |
fullQueryBuilder = QueryFactory.addTypeRestriction(query, cdmTypeRestriction); |
|
333 |
} |
|
334 |
|
|
335 |
if(filter != null) { |
|
336 |
if(fullQueryBuilder == null) { |
|
337 |
fullQueryBuilder = new Builder(); |
|
338 |
fullQueryBuilder.add(this.query, Occur.MUST); |
|
339 |
} |
|
340 |
fullQueryBuilder.add(filter, Occur.FILTER); |
|
341 |
} |
|
342 |
|
|
343 |
if(fullQueryBuilder != null) { |
|
344 |
fullQuery = fullQueryBuilder.build(); |
|
330 | 345 |
} else { |
331 | 346 |
fullQuery = this.query; |
332 | 347 |
} |
348 |
|
|
333 | 349 |
return fullQuery; |
334 | 350 |
} |
335 | 351 |
|
... | ... | |
346 | 362 |
return query; |
347 | 363 |
} |
348 | 364 |
|
349 |
public Query getExpandedQuery() { |
|
365 |
public BooleanQuery getExpandedQuery() {
|
|
350 | 366 |
expandQuery(); |
351 | 367 |
return query; |
352 | 368 |
} |
Also available in: Unified diff
#4716 using BooelanQuery added with Occur.FILTER instead of deprecated search method