Tom

(sorry in advance for the long post)

I used to use date fields the way I believe you are. When we upgraded to a
newer version of Lucene (1.3rc2 I believe), code that used to work ran
slowly, ate memory, etc. We moved to using DateFilter and a boolean query
and things went back to running well. 

Try to print out the parsed query, that was most informative (each date, and
we had different times for a given date, was another expression - ouch.)

I tried to find a small extract of what we do - it does not exist, so here
is a chopped up version (hopefully the baby did not go out with the bath
water):

        public Hits getHits(StringBuffer qs, StringBuffer error) throws
Exception {
                org.apache.lucene.search.Query q = null;

                qs.delete(0, qs.length());
                qs.append(prepareQuery());

                if ("(*)".equals(qs.toString().trim())) {
                        error.append("cannot search with just an *");
                } else
                        try {

                                DateFilter filter = null;

                                if ((startDate.length() > 6) &&
(endDate.length() > 6)) {
                                        filter =
                                                new DateFilter(
                                                        "issuedate",
        
parseAlternateDateFormats(startDate),
                                        parseAlternateDateFormats(endDate));
                                } else if (startDate.length() > 6) {
                                        filter =
DateFilter.After("issuedate", 
 
parseAlternateDateFormats(startDate));
                                } else if (endDate.length() > 6) {
                                        filter =
DateFilter.Before("issuedate", 
                                       parseAlternateDateFormats(endDate));
                                }

                                try {
                                        if
("xxxxx".equalsIgnoreCase(publication))
                                                q =
        
QueryFactory.makeQueryxxx(
                                                                publication,
        
qs.toString(),
                                                                deal,
                                                                seller,
                                                                manager,
                                                                (String)
siteSpecific.get("country"),
                                                                (String)
siteSpecific.get("collateraltype"),
                                                                (String)
siteSpecific.get("assetclass"));
                                        else if
("yyy".equalsIgnoreCase(publication))
                                                q =
        
QueryFactory.makeQueryyyy(
                                                                publication,
        
qs.toString(),
                                                                section,
                                                                category,
                                                                magazine,
                                                                pub);
                                        else
                                                q =
QueryFactory.makeQuery(publication, qs.toString());
                                } catch (TmQueryQuote e1) {
                                        error.delete(0, error.length());
                                        error.append(e1.getMessage());
                                        return null;
                                }

                                if (q != null) {
                                        if (filter == null)
                                                hits =
SearcherTM.find(publication, q);
                                        else
                                                hits =
SearcherTM.find(publication, q, filter);

                                } else
                                        error.append(" query is null ");
                        } catch (Exception e) {
                                ByteArrayOutputStream bos = new
ByteArrayOutputStream();
                                e.printStackTrace(new PrintStream(bos));
                                error.append(bos.toString());
                                throw new RuntimeException(
                                        "exception handler " +
error.toString());
                        } finally {
                                q = null;
                        }

                return hits;
        }

where the QueryFactory winds up calling a static method like:

        static public Query makeQueryzzz(String publication, String a,
String ct) {
                verifyQuoteCount(a);
                String defaultField =
AnalyzerFactory.getDefaultField(publication);
                Analyzer analyzer =
AnalyzerFactory.getAnalyzer(publication);
                BooleanQuery bq = new BooleanQuery();
                try {
                        if (!"".equals(a)) {
                                Query q1 = QueryParser.parse(a,
defaultField, analyzer);
                                bq.add(q1, true, false);
                        }
                        if (ct.length() > 0)
                                bq.add(
                                        QueryParser.parse(ct,
"level1section", analyzer),
                                        true,
                                        false);
                        return bq;
                } catch (org.apache.lucene.queryParser.ParseException e) {
                        ByteArrayOutputStream bos = new
ByteArrayOutputStream();
                        e.printStackTrace(new PrintStream(bos));
                        throw new RuntimeException(
                                "QueryFactory.makeQuery (" + a + ") " +
bos.toString());
                } catch (IllegalArgumentException e) {
                        ByteArrayOutputStream bos = new
ByteArrayOutputStream();
                        e.printStackTrace(new PrintStream(bos));
                        throw new RuntimeException(
                                "QueryFactory.makeQuery (" + a + ") " +
bos.toString());
                }
        }


"This communication is intended solely for the addressee and is
confidential and not for third party unauthorized distribution."

Reply via email to