public interface DocFetcher<T> { public T get (Document doc); } private IndexSearcher searcher; private Analyzer analyzer; /** * @param fields - fields that this search bases on * @param keywords * @param flags - indicates whether the search should use a QueryParser to parse the keywords for the specified fields or just use a TermQuery for exact match. the length of the flags array MUST be the same as that of fields * @param filter - may be null * @param sort - null if sorting the result is not required * @return count of documents that this search has found */ public <T> int search (String[] fields, boolean[] flags, String[] keywords, Filter filter, Sort sort, int pageNo, int pageSize, List<T> result, DocFetcher<T> ft) { try { long start = System.currentTimeMillis();
StringBuffer fieldStr = new StringBuffer(); StringBuffer keywordStr = new StringBuffer();
QueryParser parser = null; BooleanQuery bq = new BooleanQuery(); for (int i = 0; i < fields.length; ++i) { if (flags[i]) parser = new QueryParser(Version.LUCENE_CURRENT, fields[i], analyzer);
BooleanQuery bqInner = new BooleanQuery(); for (int j = 0; j < keywords.length; ++j) { if (flags[i]) bqInner.add(parser.parse(keywords[j]), BooleanClause.Occur.MUST); else bqInner.add(new TermQuery(new Term(fields[i], keywords[j])), BooleanClause.Occur.MUST); }
bq.add(bqInner, BooleanClause.Occur.SHOULD);
fieldStr.append('[').append(fields[i]).append("] "); } for (int i = 0; i < keywords.length; ++i) keywordStr.append('[').append(keywords[i]).append("] ");