package proj.zoie.perf.client; import java.io.File; import java.util.List; import java.util.Random; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.MultiReader; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import proj.zoie.api.IndexReaderFactory; public class SearchQueryHandler implements QueryHandler<TopDocs> { private final Query[] _queries; private final IndexReaderFactory _readerFactory; private final Random _rand; public SearchQueryHandler(File queryFile, IndexReaderFactory readerFactory) throws Exception { _readerFactory = readerFactory; _rand = new Random(System.currentTimeMillis()); List<String> queryTermList = TermFileBuilder.loadFile(queryFile); String[] queryTerms = queryTermList.toArray(new String[0]); _queries = new Query[queryTerms.length]; for (int i = 0; i < queryTerms.length; ++i) { _queries[i] = new TermQuery(new Term("contents", queryTerms[i])); } } @Override public TopDocs handleQuery() throws Exception { List<IndexReader> readers = null; IndexSearcher searcher = null; int idx = _rand.nextInt(_queries.length); Query q = _queries[idx]; try { readers = _readerFactory.getIndexReaders(); MultiReader reader = new MultiReader(readers.toArray(new IndexReader[0]), false); searcher = new IndexSearcher(reader); TopDocs docs = searcher.search(q, 10); return docs; } finally { if (readers != null) { _readerFactory.returnIndexReaders(readers); } } } @Override public String getCurrentVersion() { return _readerFactory.getCurrentReaderVersion(); } }