I was having a problem with wildcard and prefix queries not returning hits on
a stemmed field.  To solve this I overrode QueryParser to have a HashMap
of stemmed field name -> unstemmed field name and then used that map
when constructing WildcardQueries and PrefixQueries.  Now I have a Stemmed
version of a field and a unstemmed version and this QueryParser switches
between them exactly when it should.

I hope this helps someone, here is the code:

import java.util.HashMap;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.queryParser.*;

/**
 * This is a QueryParser that will fall back to unstemmed
 * field for WildcardQueries and PrefixQueries. 
 * @author bdc34 a cornell dot edu
 */
public class VitroQueryParser extends QueryParser {
        /** 
         * Map from stemmed field names to the names of fields with the
         * same terms but unstemmed.     
         */
        HashMap <String,String> stemmedToUnstemmed;
        
        public VitroQueryParser(String f, Analyzer a) {super(f, a);     }
        public VitroQueryParser(CharStream stream) {super(stream);      }
        public VitroQueryParser(QueryParserTokenManager tm) {super(tm); }
        
        /**
         * Sets the map of field name to field name where
         * the key maps to the name of the field with the unstemmed
         * version of the same terms.  
         */
        public void setStemmedToUnstemmed(HashMap<String, String> 
stemmedToUnstemmed{
                this.stemmedToUnstemmed = stemmedToUnstemmed;
        }
        
        /** 
         * attempts to get a field name for the unstemmed data of
         * the given stemmedField data.  Returns stemmedField
         * if there is not mapping in stemmedToUnstemmed. 
         */
        public String getUnstemmed(String stemmedField){
                if( stemmedField == null || 
                        stemmedToUnstemmed == null ||
                        !stemmedToUnstemmed.containsKey(stemmedField))
                        return stemmedField;
                else
                        return stemmedToUnstemmed.get(stemmedField);            
        }
        
        @Override
        protected org.apache.lucene.search.Query getPrefixQuery(String field, 
String termStr) 
        throws ParseException {         
                return super.getPrefixQuery(getUnstemmed(field), termStr);
        }
        
        @Override
        protected org.apache.lucene.search.Query getWildcardQuery(String field, 
String termStr) 
        throws ParseException {
                return super.getWildcardQuery(getUnstemmed(field), termStr);
        }       
}

-- 
Brian Caruso
Programmer/Analyst
Albert R. Mann Library
Cornell University 
Ithaca, NY 14853

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to