@Override public List<AdDefinition> search(AdRequest request) throws IOException { IndexSearcher searcher = nrt_manager.acquire(); List<AdDefinition> result = new ArrayList<AdDefinition>(); try { // Collector für die Banner AdCollector collector = new AdCollector(searcher.getIndexReader().numDocs()); // MainQuery BooleanQuery mainQuery = new BooleanQuery(); // Query für den/die BannerTypen BooleanQuery typeQuery = new BooleanQuery(); for (AdType type : request.types()) { TermQuery tq = new TermQuery(new Term(AdDBConstants.ADDB_AD_TYPE, type.getType())); typeQuery.add(tq, Occur.SHOULD); } mainQuery.add(typeQuery, Occur.MUST); // Query für den/die BannerFormate BooleanQuery formatQuery = new BooleanQuery(); for (AdFormat format : request.formats()) { TermQuery tq = new TermQuery(new Term(AdDBConstants.ADDB_AD_FORMAT, format.getCompoundName())); formatQuery.add(tq, Occur.SHOULD); } mainQuery.add(formatQuery, Occur.MUST); // Query für die Bedingungen unter denen ein Banner angezeigt werden soll Query cq = LuceneQueryHelper.getInstance().getConditionalQuery(request, this.addb); if (cq != null) { mainQuery.add(cq, Occur.MUST); } /* * Es sollen nur Produkte geliefert werden */ if (request.products()) { // search online for products mainQuery.add( new TermQuery( new Term(AdDBConstants.ADDB_AD_PRODUCT, AdDBConstants.ADDB_AD_PRODUCT_TRUE)), Occur.MUST); // if possible add the product name, so online ads for that product will be found if (!Strings.isNullOrEmpty(request.product())) { mainQuery.add( new TermQuery(new Term(AdDBConstants.ADDB_AD_PRODUCT_NAME, request.product())), Occur.MUST); } } else { mainQuery.add( new TermQuery( new Term(AdDBConstants.ADDB_AD_PRODUCT, AdDBConstants.ADDB_AD_PRODUCT_FALSE)), Occur.MUST); } logger.debug(mainQuery.toString()); System.out.println(mainQuery.toString()); searcher.search(mainQuery, collector); BitSet hits = collector.getHits(); // Ergebnis for (int i = hits.nextSetBit(0); i != -1; i = hits.nextSetBit(i + 1)) { Document doc = searcher.doc(i); result.add(addb.getBanner(doc.get(AdDBConstants.ADDB_AD_ID))); } } finally { nrt_manager.release(searcher); } return result; }